2016-07-20 6 views
3

Ich habe eine gzip, die etwa 90 GB ist. Dies ist gut innerhalb des Speicherplatzes, aber viel größer als RAM.Wie importiere ich eine gzip-Datei, die größer als RAM limit ist, in einen Pandas DataFrame? "Töte 9" Benutze HDF5?

Wie kann ich das in einen Pandas Datenrahmen importieren? Ich habe versucht, die folgenden in der Befehlszeile:

# start with Python 3.4.5 
import pandas as pd 
filename = 'filename.gzip' # size 90 GB 
df = read_table(filename, compression='gzip') 

jedoch nach einigen Minuten, Python schaltet sich ab mit Kill 9.

Nachdem ich das Datenbankobjekt df definiert hatte, plante ich, es in HDF5 zu speichern.

Was ist der richtige Weg, dies zu tun? Wie kann ich pandas.read_table() verwenden, um dies zu tun?

Antwort

9

ich es auf diese Weise tun würde:

filename = 'filename.gzip'  # size 90 GB 
hdf_fn = 'result.h5' 
hdf_key = 'my_huge_df' 
cols = ['colA','colB','colC','ColZ'] # put here a list of all your columns 
cols_to_index = ['colA','colZ'] # put here the list of YOUR columns, that you want to index 
chunksize = 10**6    # you may want to adjust it ... 

store = pd.HDFStore(hdf_fn) 

for chunk in pd.read_table(filename, compression='gzip', header=None, names=cols, chunksize=chunksize): 
    # don't index data columns in each iteration - we'll do it later 
    store.append(hdf_key, chunk, data_columns=cols_to_index, index=False) 

# index data columns in HDFStore 
store.create_table_index(hdf_key, columns=cols_to_index, optlevel=9, kind='full') 
store.close() 
+0

Dank dafür! Sie passen den Parameter 'chunksize' an, abhängig davon, ob das Skript abstürzt (wie oben)? – JianguoHisiang

+0

@ JianguoHisiang, ja, Sie können eine fundierte Vermutung machen ... Zum Beispiel, wenn Ihr Server 32 GB RAM hat und 1M ('10 ** 6') Zeilen DF benötigt 1 GB - Sie können es bis zu 20M erhöhen (' 2 * 10 ** 7') und testen Sie es und prüfen Sie, ob es Ihnen Geschwindigkeitsvorteile gibt oder nicht ... – MaxU

+0

Die Eingabedatei 'filename.gzip' hat keine Kopfzeile. 'cols_to_index' bezieht sich auf Spalten, die im Datenrahmen bereits beschriftet sein müssen, richtig? Um dies für eine Header-lose Gzip-Datei zu tun, müssen Sie die Datenspalten in jeder Iteration bei 'pd.read_table()' oben indizieren? Das kann ineffizient sein ... – JianguoHisiang

Verwandte Themen