2013-08-13 10 views
5

OK Ich experimentiere mit Pandas, um eine 30GB CSV-Datei mit 40 Millionen + Zeilen und 150+ Spalten in HDFStore zu laden. Die Mehrzahl der Spalten sind Strings, gefolgt von Zahlen und Daten.Pandas HDFStore Datenrahmen aus dem Speicher entladen

Ich habe nie wirklich numpy, Pandas oder pytables verwendet vor, aber haben mit Datenrahmen in R. rumgespielt

Ich bin derzeit nur eine Beispieldatei von rund 20.000 Zeilen zu HDFStore speichern. Wenn ich versuche, um die Tabelle zu lesen von HDFStore wird die Tabelle in dem Speicher und Speichernutzung von ~ 100 MB steigt geladen

f=HDFStore('myfile.h5') 
g=f['df'] 

Dann lösche ich die Variable, die den Datenrahmen enthält:

del g 

An der Stelle, die Speichernutzung verringert sich um etwa 5 MB

Wenn ich die Daten erneut in g g=f['df'] Verwendung laden, nimmt die Speichernutzung eine weitere 100MB bis

Clea nup passiert nur, wenn ich das Fenster schließe.

Die Art, wie die Daten organisiert sind, werde ich wahrscheinlich die Daten in einzelne Tabellen mit der maximalen Tabellengröße um 1GB teilen, die in den Speicher passen und dann eins nach dem anderen verwenden können. Dieser Ansatz funktioniert jedoch nicht, wenn ich den Speicher nicht löschen kann.

Irgendwelche Ideen, wie ich das erreichen kann?

+0

Sie haben das gelesen? (Zeigt eine Funktion zum Einlesen von Daten aus der CSV-Datei und zum Erstellen eines Speichers nach Blöcken, wobei auch das Datum analysiert wird): http://stackoverflow.com/questions/16110252/need-to-compare-yy-large-files-around -1-5GB-in-Python/16110391 # 16110391 – Mattijn

+1

Sie müssen den Laden schließen. Es gibt umfangreiche Dokumentation der Verwendung von '' HDFStore'' [hier] (http://pandas.pydata.org/pandas-docs/dev/io.html#hdf5-pytables) – Jeff

+0

irgendwelche Updates zu diesem Thema? Ich habe das gleiche Problem. und '' f.close() '' ändert nicht die Speicherverwendung in meinem Fall – sanguineturtle

Antwort

2

auf dem zweiten Punkt des OPs Frage zu beantworten („wie Speicher frei“)

Kurze Antwort

Schließen des Geschäftes und die ausgewählte Datenrahmen funktioniert nicht löschen, jedoch fand ich einen Anruf zu gc.collect() löscht Speicher gut nachdem Sie den Datenrahmen löschen.

Beispiel

Im Beispiel unten wird der Speicher wie erwartet automatisch gereinigt:

data=numpy.random.rand(10000,1000)   # memory up by 78MB 
df=pandas.DataFrame(data)     # memory up by 1 MB 

store = pandas.HDFStore('test.h5')   # memory up by 3 MB 
store.append('df', df)      # memory up by 9 MB (why?!?!) 

del data         # no change in memory 
del df          # memory down by 78 MB 

store.close()        # no change in memory 
gc.collect()        # no change in memory (1) 

(1) ist der Laden immer noch in Erinnerung, wenn auch

geschlossen

Jetzt nehmen wir weiterhin von oben und wieder öffnen store wie unten. Der Speicher wird gereinigt erst nach GC.Collect() aufgerufen wird:

store = pandas.HDFStore('test.h5')   # no change in memory (2) 
df = store.select('df')     # memory up by 158MB ?! (3) 
del df          # no change in memory 
store.close()        # no change in memory 
gc.collect()        # memory down by 158 MB (4) 

(2) das Geschäft nie verlassen, (3) Ich habe gelesen, dass die Auswahl einer Tabelle migth die sixe so viel wie 3x nehmen der Tabelle, (4) ist der Laden noch da

Schließlich habe ich auch versucht, eine .copy() der df auf offen zu tun (df = store.select('df')). Do not tun dies, es schafft ein Monster im Speicher, die nicht nachträglich gesammelt werden kann.

Letzte Frage Wenn ein DF im Speicher 100 MB sind, verstehe ich es vielleicht 2-3x Größe im Speicher belegt beim Laden, aber warum ist es bei 200MB in Erinnerung bleiben , nachdem ich es von einem HDFStore und in der Nähe wählen das Geschäft?