Nachdem hilfe von 2 netten herren, ich habe es geschafft, auf datentabellen von datenframe + plyr umzuschalten.
Die Situation und meine Fragen
Als ich daran arbeitete, bemerkte ich, dass die Speicherspitzenbelegung von 3,5 GB auf 6,8 GB (nach Windows Task Manager) fast verdoppelt wurde, als ich eine neue Spalte mit :=
zu meinem Datensatz hinzufügte enthält ~ 200K Zeilen zu 2.5K Spalten.
Ich habe dann versucht 200M Zeile um 25 Col, der Anstieg war von 6 GB bis 7,6 GB vor dem Abfallen auf 7,25 GB nach einem gc()
.
Speziell im Hinblick auf das Hinzufügen neuer Spalten erwähnt Matt Dowle selbst hier , dass:
Mit dem Operator: = können Sie:
%Vor%Keine dieser Operationen kopiert die (möglicherweise große) data.table at alles, nicht einmal einmal.
Frage 1: Warum würde eine einzelne Spalte von "NAs" für ein DT mit 2.5K Spalten double den Peakspeicher hinzufügen, der verwendet wird, wenn die data.table überhaupt nicht kopiert wird?
Frage 2: Warum tritt die Verdoppelung nicht auf, wenn der DT 200M x 25 ist? Ich habe den Printscreen dafür nicht hinzugefügt, aber zögern Sie nicht, meinen Code zu ändern und es zu versuchen.
Druckt Bildschirme für die Speichernutzung mit Testcode
Saubere Neustart, RStudio & amp; MS Word geöffnet - 103 MB verwendet
Nach dem Ausführen des DT-Erstellungscodes, aber vor dem Hinzufügen der Spalte - 3.5GB verwendet
Nach dem Hinzufügen 1 Spalte mit NA gefüllt, aber vor gc () - 6.8GB verwendet
Nach dem Ausführen von gc () - 3,5 GB verwendet
Testcode
Um dies zu untersuchen, habe ich den folgenden Testcode erstellt, der meinen Datensatz genau nachahmt:
%Vor%Forschung erledigt
Ich habe nicht zu viel Diskussion über die Speichernutzung für DT mit vielen Spalten gefunden, nur dies , aber selbst dann geht es nicht speziell um das Gedächtnis.
Die meisten Diskussionen über die Verwendung großer Datenmengen + Arbeitsspeicher betreffen DTs mit sehr großen Zeilen, aber relativ wenigen Spalten.
Mein System
Intel i7-4700 mit 4-adrigem / 8-adrigem; 16 GB DDR3-12800 RAM; Windows 8.1 64-Bit; 500 GB 7200 U / min HDD; 64-Bit R; Datentabelle Version 1.9.4
Disclaimer
Bitte verzeihen Sie mir, dass Sie eine "Nicht-R" -Methode (d. h. Task-Manager) verwenden, um den verwendeten Speicher zu messen. Memory Messung / Profiling in R ist etwas, was ich noch nicht herausgefunden habe.
Edit 1: Nach dem Update auf Datentabelle 1.9.5 und erneut ausgeführt. Das Problem ist leider weiterhin aufgetreten.
(Ich kann keinen Kredit nehmen, da die großen DT-Köpfe (Arun) daran gearbeitet haben und festgestellt haben, dass sie mit print.data.table zusammenhingen. Schließen Sie hier einfach die Schleife für andere SO-Benutzer.)
Es scheint, dass dieses data.table
Speicherproblem mit :=
auf R Version 3.2 gelöst wurde, wie es von:
Ссылка
[Zitat von @Arun aus der Github-Ausgabe 1062 ...]
behoben in R v3.2, IIUC, mit diesem Artikel von NEWS:
Beim automatischen Drucken werden Objekte nicht mehr dupliziert, wenn der Druck an eine Methode gesendet wird.
Daher sollten andere mit diesem Problem versuchen, auf R 3.2 zu aktualisieren.
Tags und Links memory r data.table large-data