2010-11-08 12 views
7

Ich versuche R zu verwenden, um große DNA-Sequenzdateien (fastq-Dateien, jeweils mehrere Gigabytes) zu analysieren, aber die Standard-R-Schnittstelle zu diesen Dateien (ShortRead) muss die gesamte Datei auf einmal lesen. Dies passt nicht in den Speicher, so dass es einen Fehler verursacht. Gibt es eine Möglichkeit, dass ich ein paar (tausend) Zeilen gleichzeitig lesen, sie in eine In-Memory-Datei stopfen und dann ShortRead verwenden kann, um aus dieser In-Memory-Datei zu lesen?Gibt es eine Möglichkeit, In-Memory-Dateien in R zu lesen und zu schreiben?

Ich bin auf der Suche nach so etwas wie Perl IO :: Scalar, für R.

+0

Eigentlich glaube ich nicht, dass ich mein Problem damit lösen kann: die fragliche Funktion (readFastq) will eine Datei * name *, also bin ich mir nicht sicher, ob ich stattdessen eine beliebige Verbindung übergeben kann. –

+0

Ich denke, was Sie suchen, wird in den Antworten auf diesen Beitrag beschrieben: http://StackOverflow.com/Questions/1727772/Quickly-Reading-Iy-large-Tables-as-Dataframes-in-R/1820610 Ich besonders wie die sqldf-Lösung. –

Antwort

2

Es sieht so aus, als würde ShortRead demnächst eine "FastqStreamer" -Klasse hinzufügen, die das macht, was ich will.

2

Ich weiß nicht viel über R, aber haben Sie schon einen Blick auf die mmap package?

1

Nun, ich weiß nicht, über readFastq etwas anderes als eine Datei zu akzeptieren ...

Aber wenn es kann, für andere Funktionen, können Sie das R-Funktion Rohr verwenden(), um eine Unix-Verbindung zu öffnen, Dann könntest du das mit einer Kombination aus Unix-Befehlen, head und tail, und einigen Pipes machen.

Zum Beispiel erhalten die Leitungen 90 bis 100, verwenden Sie diese:

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

So können Sie einfach die Datei in Stücke lesen.

Wenn Sie müssen, können Sie immer diese Unix-Dienstprogramme verwenden, um eine temporäre Datei zu erstellen, und lesen Sie diese dann mit shortRead ein. Es ist ein Schmerz, aber wenn es nur eine Datei aufnehmen kann, funktioniert es zumindest.

1

Übrigens, die Antwort auf eine In-Memory-Datei in R (wie Perl IO :: Scalar) ist die textConnection-Funktion. Leider kann das ShortRead-Paket textConnection-Objekte nicht als Eingaben verarbeiten, daher ist die Idee, die ich in der Frage des Lesens einer Datei in kleinen Chunks in In-Memory-Dateien, die dann bitweise analysiert werden, sicherlich für viele Anwendungen möglich ist nicht für eine bestimmte Anwendung, da ShortRead keine textConnections mag. Die Lösung ist also die oben beschriebene FastqStreamer-Klasse.