vectors - rbind r list




Speichereffiziente Alternative zu rbind-in-place rbind? (3)

Ich muss zwei große Datenrahmen verbinden. Im Moment benutze ich

df <- rbind(df, df.extension)

aber ich habe (fast) sofort keine Speicher mehr. Ich denke es ist, weil df zweimal im Speicher gehalten wird. Ich werde vielleicht in Zukunft noch größere Datenrahmen sehen, also brauche ich eine Art In-Place-Verbindung.

Meine Frage ist also: Gibt es eine Möglichkeit, bei der Verwendung von rbind die Datendopplung im Speicher zu vermeiden?

Ich habe diese question , die SqlLite verwendet, aber ich möchte wirklich vermeiden, die Festplatte als Cache zu verwenden.


Dies ist ein perfekter Kandidat für bigmemory . Weitere Informationen finden Sie auf der Website . Hier sind drei Verwendungsaspekte zu beachten:

  1. Es ist in Ordnung, die HD zu verwenden: Die Speicherzuordnung zur HD ist viel schneller als praktisch alle anderen Zugriffe, so dass Sie möglicherweise keine Verlangsamungen sehen. Manchmal verlasse ich mich auf> 1 TB Speicherkarten, obwohl die meisten zwischen 6 und 50 GB liegen. Da das Objekt eine Matrix ist, erfordert dies darüber hinaus keinen echten Overhead des Neuschreibens von Code, um das Objekt zu verwenden.
  2. Unabhängig davon, ob Sie eine dateigestützte Matrix verwenden oder nicht, können Sie separated = TRUE , um die Spalten zu trennen. Ich habe wegen meines 3. Tipps nicht so viel gebraucht:
  3. Sie können den HD-Raum überzuordnen, um eine größere mögliche Matrixgröße zu ermöglichen, aber nur die interessierende Untermatrix laden. Auf diese Weise besteht keine Notwendigkeit, rbind zu tun.

Hinweis: Obwohl die ursprüngliche Frage Datenrahmen adressiert und bigmemory für Matrizen geeignet ist, kann man leicht verschiedene Matrizen für verschiedene Datentypen erstellen und dann die Objekte im RAM kombinieren, um einen Datenrahmen zu erzeugen, wenn es wirklich notwendig ist.


Im Moment habe ich folgende Lösung ausgearbeitet:

nextrow = nrow(df)+1
df[nextrow:(nextrow+nrow(df.extension)-1),] = df.extension
# we need to assure unique row names
row.names(df) = 1:nrow(df)

Jetzt habe ich nicht genug Speicher. Ich denke, weil ich es aufbewahre

object.size(df) + 2 * object.size(df.extension)

während mit rbind R würde brauchen

object.size(rbind(df,df.extension)) + object.size(df) + object.size(df.extension). 

Danach benutze ich

rm(df.extension)
gc(reset=TRUE)

um die Erinnerung zu befreien, die ich nicht mehr brauche.

Dies hat mein Problem im Moment gelöst, aber ich denke, dass es einen fortgeschritteneren Weg gibt, eine speichereffiziente Verbindung zu machen. Ich freue mich über Kommentare zu dieser Lösung.








rbind