2010-11-08 8 views
7

Estoy tratando de usar R para analizar archivos grandes de secuencias de ADN (archivos fastq, varios gigabytes cada uno), pero la interfaz R estándar para estos archivos (ShortRead) tiene que leer todo el archivo a la vez. Esto no cabe en la memoria, por lo que causa un error. ¿Hay alguna manera de que pueda leer unas pocas (mil) líneas a la vez, rellenarlas en un archivo en memoria y luego usar ShortRead para leer desde ese archivo en memoria?¿Hay alguna forma de leer y escribir archivos en memoria en R?

Busco algo así como de Perl IO :: escalar, para R.

+0

En realidad, no creo que pueda resolver mi problema con esto: la función en cuestión (readFastq) quiere un * nombre * de archivo, por lo que no estoy seguro de que pueda pasar una conexión arbitraria. –

+0

Creo que lo que está buscando se describe en las respuestas a esta publicación: http://stackoverflow.com/questions/1727772/quickly-reading-very-large-tables-as-dataframes-in-r/1820610 Especialmente como la solución sqldf. –

Respuesta

2

Parece que ShortRead pronto agregará una clase "FastqStreamer" que hace lo que yo quiero.

2

No sé mucho acerca de R, pero he tenido un vistazo a la mmap package?

1

Bueno, yo no sé nada de readFastq aceptar algo que no sea un archivo ...

Pero si puede, para otras funciones, puede utilizar la tubería función R() para abrir una conexión UNIX, entonces podrías hacer esto con una combinación de comandos de unix cabeza y cola y algunos tubos.

Por ejemplo, para obtener líneas 90 a 100, utiliza este:

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

lo que sólo puede leer el archivo en trozos.

Si tiene que hacerlo, siempre puede utilizar estas utilidades de Unix para crear un archivo temporal, y luego leerlo con shortRead. Es un dolor, pero si solo puede tomar un archivo, al menos funciona.

1

Por cierto, la respuesta a, en general, cómo hacer un archivo en memoria en R (como IO :: Scalar de Perl) es la función textConnection. Lamentablemente, el paquete ShortRead no puede manejar objetos textConnection como entradas, por lo que la idea que expresé en la pregunta de leer un archivo en trozos pequeños en archivos en memoria que luego son analizados bit a bit es ciertamente posible para muchas aplicaciones, pero no para mayo aplicación particular ya que ShortRead no le gusta textConnections. Entonces la solución es la clase FastqStreamer descrita arriba.

Cuestiones relacionadas