2016-06-02 7 views
2

Ich habe ein Skript, das eine Datentabelle durch Einfügen von Daten Zeile für Zeile mithilfe einer Schleife erstellt. Die Einfügung erfolgt mit rbindlist(). Diese Methode scheint variieren aufwendig zu werden, da es, dass meine Datentabelle in jeder Iteration scheint dt umverteilt wird:Eine speichereffiziente Einfügung einer Zeile in ein data.table-Objekt?

tracemem(dt) 
[1] "<0x2bd3d00>" 
tracemem(dt <- rbindlist(list(dt, newrow))) 
[1] "<0x44a7fe0>" 

einige alte Kommentare (~ 3 Jahre) in diesem question erwähnen die Planung eines insert() Verfahren jedoch Ich habe diesbezüglich keine Aktualisierung gefunden. Gibt es eine speichereffiziente Methode, um dies zu tun?

+0

Sie können solche Dinge im Projekt-Tracker verfolgen. Zum Einfügen https://github.com/Rdatatable/data.table/issues/660 und zum Löschen https://github.com/Rdatatable/data.table/issues/635 – Frank

Antwort

4

Sie wachsen ein Objekt in einer Schleife. Natürlich ist das langsam, es spielt keine Rolle, dass es sich um eine data.table handelt.

Eines der Geheimnisse, warum data.table so effizient ist, ist, dass es zu viel reserviert, d. H. Speicher für Spalten reserviert, die während seiner Erstellung nicht existieren. Sie müssen so etwas für Zeilen machen. Erstellen Sie die ganze Anzahl von leeren Zeilen, die Sie in Ihrer Schleife benötigen, binden Sie sie an die data.table auf einmal und füllen Sie sie durch Zuweisung in der Schleife, vorzugsweise unter Verwendung von set.

+0

Danke, ich werde das versuchen –