R - Warum das Hinzufügen von 1 Spalte zur Datentabelle fast verdoppelt Spitzenspeicher verwendet?

8

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

  1. Saubere Neustart, RStudio & amp; MS Word geöffnet - 103 MB verwendet

  2. Nach dem Ausführen des DT-Erstellungscodes, aber vor dem Hinzufügen der Spalte - 3.5GB verwendet

  3. Nach dem Hinzufügen 1 Spalte mit NA gefüllt, aber vor gc () - 6.8GB verwendet

  4. 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.

    
NoviceProg 05.02.2015, 15:04
quelle

1 Antwort

3

(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.

    
micstr 31.05.2015, 18:32
quelle

Tags und Links