Есть ли способ читать и записывать файлы в памяти в R?

Я пытаюсь использовать R для анализа больших файлов последовательности ДНК (файлы fastq, по несколько гигабайт каждый), но стандартный интерфейс R для этих файлов (ShortRead) должен читать весь файл сразу. Это не помещается в памяти, поэтому вызывает ошибку. Есть ли способ, которым я могу читать несколько (тысяч) строк за раз, помещать их в файл в памяти, а затем использовать ShortRead для чтения из этого файла в памяти?

Я ищу что-то вроде Perl IO::Scalar для R.


person Ryan C. Thompson    schedule 08.11.2010    source источник
comment
На самом деле, я не думаю, что смогу решить свою проблему с помощью этого: рассматриваемая функция (readFastq) хочет файл name, поэтому я не уверен, что вместо этого смогу передать произвольное соединение.   -  person Ryan C. Thompson    schedule 08.11.2010
comment
Я думаю, что то, что вы ищете, описано в ответах на этот пост: stackoverflow.com/questions/1727772/ Мне особенно нравится решение sqldf.   -  person Roman Luštrik    schedule 15.09.2011


Ответы (4)


Я мало что знаю о R, но вы видели пакет mmap?

person Konrad Rudolph    schedule 08.11.2010

Похоже, в ShortRead скоро появится класс FastqStreamer, который делает то, что я хочу.

person Ryan C. Thompson    schedule 21.06.2012

Ну, я не знаю о том, что readFastq принимает что-то кроме файла...

Но если это возможно, для других функций вы можете использовать функцию R pipe() для открытия соединения unix, тогда вы можете сделать это с помощью комбинации команд unix head и tail и некоторых каналов.

Например, чтобы получить строки с 90 по 100, вы используете это:

head file.txt -n 100 | tail -n 10

Таким образом, вы можете просто читать файл кусками.

Если вам нужно, вы всегда можете использовать эти утилиты unix для создания временного файла, а затем прочитать его с помощью shortRead. Это боль, но если он может принимать только файл, по крайней мере, он работает.

person nsheff    schedule 15.09.2011

Между прочим, ответом на вопрос, как сделать файл в памяти в R (например, IO::Scalar в Perl), является функция textConnection. К сожалению, пакет ShortRead не может обрабатывать объекты textConnection в качестве входных данных, поэтому идея, которую я выразил в вопросе о чтении файла небольшими фрагментами в файлы в памяти, которые затем анализируются по крупицам, безусловно, возможна для многих приложений, но не для конкретного приложения, поскольку ShortRead не любит textConnections. Итак, решение — класс FastqStreamer, описанный выше.

person Ryan C. Thompson    schedule 22.06.2012