2010-11-08 15 views
7

Sto cercando di utilizzare R per analizzare file di sequenze di DNA di grandi dimensioni (file fastq, diversi gigabyte ciascuno), ma l'interfaccia standard R per questi file (ShortRead) deve leggere l'intero file in una sola volta. Questo non si adatta alla memoria, quindi provoca un errore. C'è un modo in cui posso leggere alcune (migliaia) righe alla volta, inserirle in un file in memoria e quindi usare ShortRead per leggere da quel file in memoria?C'è un modo per leggere e scrivere file in memoria in R?

Sto cercando qualcosa di simile di Perl IO :: scalare, per R.

+0

In realtà, non penso di poter risolvere il mio problema con questo: la funzione in questione (readFastq) vuole un file * nome *, quindi non sono sicuro di poter passare una connessione arbitraria. –

+0

Penso che quello che stai cercando sia descritto nelle risposte a questo post: http://stackoverflow.com/questions/1727772/quickly-reading-very-large-tables-as-dataframes-in-r/1820610 I specialmente come la soluzione sqldf. –

risposta

2

Sembra che ShortRead aggiunga presto una classe "FastqStreamer" che fa ciò che voglio.

2

Non so molto di R, ma hai avuto uno sguardo al mmap package?

1

Beh, io non so readFastq accettare qualcosa di diverso da un file ...

Ma se può, per altre funzioni, è possibile utilizzare la funzione di tubo di R() per aprire una connessione unix, quindi puoi farlo con una combinazione di comandi unix testa-coda e alcuni tubi.

Ad esempio, per ottenere linee da 90 a 100, si utilizza questo:

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

quindi si può solo leggere il file in blocchi.

Se è necessario, è sempre possibile utilizzare queste utilità unix per creare un file temporaneo, quindi leggerlo con shortRead. È un dolore, ma se può solo prendere un file, almeno funziona.

1

Per inciso, la risposta a generalmente come eseguire un file in memoria in R (come Perl's IO :: Scalar) è la funzione textConnection. Purtroppo, il pacchetto ShortRead non può gestire gli oggetti textConnection come input, quindi mentre l'idea che ho espresso nella domanda di leggere un file in piccoli blocchi in file in memoria che vengono poi analizzati bit per bit è certamente possibile per molte applicazioni, ma non per la particolare applicazione in quanto ShortRead non ama le TextConnections. Quindi la soluzione è la classe FastqStreamer descritta sopra.

Problemi correlati