Wie fügt man mehrere große data.table-Objekte in eine einzige data.table ein und exportiert sie schnell in csv, ohne den Speicher zu verlieren?

8

Die einfache Antwort darauf ist "kaufe mehr RAM", aber ich hoffe, dass ich eine konstruktivere Antwort bekomme und dabei etwas lerne.

Ich verwende Windows 7 64-bit mit 8 GB RAM.

Ich habe mehrere sehr große .csv.gz-Dateien (~ 450MB unkomprimiert) mit den gleichen exakten Header-Informationen, die ich in R eingelesen habe, und führe eine Bearbeitung durch. Dann muss ich die verarbeiteten R-Objekte zu einem einzigen Master-Objekt kombinieren und auf die CD zurückschreiben.

Ich mache dieselbe Operation für mehrere Sätze von Dateien. Als Beispiel habe ich 5 Ordner mit jeweils 6 csv.gz-Dateien. Ich muss mit 5 Hauptdateien enden, eine für jeden Ordner.

Mein Code sieht ungefähr wie folgt aus:

%Vor%

Dieser Code funktioniert nicht. Ich bekomme den cannot allocate memory Fehler, bevor es den endgültigen csv schreibt. Ich habe den Ressourcenmonitor beim Ausführen dieses Codes beobachtet und verstehe nicht, warum 8 GB RAM für diese Verarbeitung benötigt wird. Die Summe aller Dateigrößen beträgt ungefähr 2,7 GB, so dass ich erwartet habe, dass der maximale Speicher R 2,7 GB beträgt. Aber die write.csv-Operation scheint die gleiche Menge an Speicher zu verwenden wie das Datenobjekt, das Sie schreiben. Wenn Sie also ein 2,7 GB-Objekt im Speicher haben und versuchen, es auszu schreiben, würden Sie 5,6 GB Speicher verwenden. p>

Diese scheinbare Realität, kombiniert mit der Verwendung einer for -Schleife, in der der Speicher scheinbar nicht ausreichend freigegeben wird, scheint das Problem zu sein.

Ich vermute, dass ich das Paket sqldf wie erwähnt verwenden könnte hier und hier , aber als ich die sqldf -Anweisung auf eine R-Variable gesetzt habe, hatte ich dieselben Fehler wegen zu wenig Speicher.

    
Brian D 20.12.2013, 22:34
quelle

1 Antwort

5

Update 12/23/2013 - Die folgende Lösung funktioniert in R, ohne dass der Arbeitsspeicher knapp wird (Danke @AnandaMahto).
Der Hauptvorbehalt bei dieser Methode besteht darin, dass Sie absolut sicher sein müssen, dass die Dateien, die Sie ein- und ausschreiben, genau die gleichen Header-Spalten in genau derselben Reihenfolge haben, oder Ihr R-Verarbeitungscode muss dies sicherstellen, da write.table dies tut überprüfe das nicht für dich.

%Vor%

Meine anfängliche Lösung:

%Vor%

Ich habe dann das sed-Paket von GnuWin32 heruntergeladen und installiert und die Windows-Befehlszeilentools verwendet, um die Dateien wie folgt anzufügen:

%Vor%

Dies fügt alle einzelnen .csv-Dateien zusammen, deren Namen das Textmuster "common_pattern" enthalten, Header und alle.

Dann verwende ich sed.exe, um alle außer der ersten Kopfzeile wie folgt zu entfernen:

%Vor%

-i weist sed an, die angegebene Datei (in-place) zu überschreiben.

2,$ sagt sed, um den Bereich von der 2. Zeile bis zur letzten Zeile anzusehen ($)

{/header_pattern/d;} sagt sed nach allen Zeilen im Bereich mit dem Text "header_pattern" in ihnen und d lösche diese Zeilen

Um sicherzugehen, dass dies der Fall war, druckte ich zuerst die Zeilen, die ich löschen wollte.

%Vor%

Funktioniert wie ein Zauber, ich wünschte nur, ich könnte alles in R machen.

    
Brian D 20.12.2013, 22:34
quelle

Tags und Links