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.
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.
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.
Funktioniert wie ein Zauber, ich wünschte nur, ich könnte alles in R machen.
Tags und Links memory r csv data.table sqldf