2012-04-10 9 views
2

Ich habe 4 GB RAM und habe Probleme beim Ziehen von 147.6MB in R in Linux, entsprechend der Fehlermeldung, die ich bekomme: Error: cannot allocate vector of size 147.6 Mb.Das Zusammenführen von data.frames führt zu einem nicht ausreichenden Speicherfehler

Wie kann ich dies diagnostizieren?

Hier ist mein Code:

IDs <- read.csv('Set1.csv') # 2 MB 
Set2 <- read.csv('Set2.csv') # 240 MB 
data <- merge(IDs, Set2, by='MemberID') 
rm(IDs)      # Remove junk! 
rm(Set2)      # Remove junk! 
gc() 
print('First merge complete') 

Set3 <- read.csv('Set3.csv') # 25 MB 
data <- merge(data, Set3, by='MemberID') 
rm(Set3)      # Remove junk! 
gc() 
print('Second merge complete') 

Die Ausführung stoppt nach der ersten print-Anweisung. Ich kann nicht verstehen, woher die zusätzliche Speicherbelegung kommt. Wenn man sich die Dokumentation zu memory() in R ansieht, scheint es sich um ein zusammenhängendes Speicherproblem zu handeln. Gibt es eine Möglichkeit, dies in R auf Ubuntu zu behandeln?

Auch andere Leute, die ähnliche Fragen stellten, wurden hier angeschaut, aber die vorgeschlagenen Lösungen waren Windows-spezifisch.

EDIT 1

Einige Kommentare die Kommentare unten Adresse:

> print(object.size(IDs), units="Mb") 
1.3 Mb 
> print(object.size(Set2), units="Mb") 
142.6 Mb 
> print(object.size(Set3), units="Mb") 
12.5 Mb 

Also, es sieht nicht aus wie die Objekte zu viel Größe ändern sich von in von CSV gelesen werden. Ich werde auf data.table prüfen() und der Rest ...

EDIT 2

ich meinen Code aktualisiert haben data.table() zu verwenden und den gleichen Fehler haben. Das macht mich besorgt, dass es vielleicht irgendwie speziell für meine Maschine ist? Dies erscheint nur sehr seltsam für die Größe der beteiligten Dateien. Error: cannot allocate vector of size 147.6 Mb

IDs <- as.data.table(read.csv('Set1.csv')) # 2 MB 
Set2 <- as.data.table(read.csv('Set2.csv')) # 240 MB 
data <- merge(IDs, Set2, by='MemberID') 
rm(IDs)      # Remove junk! 
rm(Set2)      # Remove junk! 
gc() 
print('First merge complete') 

Set3 <- as.data.table(read.csv('Set3.csv')) # 25 MB 
data <- merge(data, Set3, by='MemberID') 
rm(Set3)      # Remove junk! 
gc() 
print('Second merge complete') 

EDIT 3

meine Daten durchgecheckt, ich vermute, dass das Problem hier sein kann. Es gab einige allgemeine Feldnamen in Set3.csv, also glaube ich, dass es böse n x n Joins oder so gemacht hat.

+3

Du bist irgendwo in dem, was ich denke, der zweite Kreis von [The R Inferno] (https://www.google.com/url?q=http://www.burns-stat.com/pages/ Tutor/R_inferno.pdf & sa = U & ei = gr-ET_f2Ms_TiAKs-fH1BA & ved = 0CBAQFjAA & usg = AFQjCNFYCWUrzMj_7SOwr-EJ9Gu34VOl_w).Merge ist sehr speicherintensiv, ich nehme an, dass, wenn man sich 'object.size' anschaut, die csv-Dateien wesentlich größer sind, als wenn man das in R gelesen hat. – Justin

+0

Ich hatte glücklicherweise' data.table() ' zum Zusammenführen großer Datenobjekte, sowohl hinsichtlich der Speicherverwaltung als auch der Betriebsleistung. – Chase

+0

Nur eine kurze Überprüfung, Sie sind in einer frischen R Sitzung richtig? – jimmyb

Antwort

0

Wechseln zu data.table() als @Chase in den Kommentaren oben vorgeschlagen, und Löschen von Objekten erlaubt liberal erlaubt mir die erste Zusammenführung zu verarbeiten. Es stellte sich heraus, dass eine spätere Zusammenführung, die zu Problemen führte, tatsächlich eine kartesische Verknüpfung war, die ich aufgrund des zweiten Datensatzes mit nicht eindeutigen Schlüsseln nicht erwartet hatte, also musste ich das vollständig fallen lassen.

Ich habe dies vorübergehend gelöst, indem ich Daten unterteilte, aber ich hatte später einen ähnlichen Fehler, als ich versuchte, ein Modell auf eine Vorhersage anzuwenden.

Die Moral der Geschichte ist, dass R-Funktionen viel mehr Speicher als die Größe des eingehenden Vektors selbst verwenden, wie von @Justin oben vorgeschlagen, gemessen mit object.size. In ähnlicher Weise für Funktionen, die während der Verarbeitungsvorgänge nicht im RAM verfügbar sind.

0

Ich hatte ein sehr ähnliches Problem. Mein Problem war, dass ich NA's in die Spalte "by" beider Datenfelder einführte.

Welche verursacht in einem sehr großen Dataframe am Ende. Fixing oder Entfernen der Zeilen mit NA löste das Problem für.

Verwandte Themen