2013-05-19 4 views
5

Ich habe einen Datenrahmen in Pandas:Unable Datenrahmen zu HDF5 ("Objekt-Header-Nachricht ist zu groß") speichern

In [7]: my_df 
Out[7]: 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 34 entries, 0 to 0 
Columns: 2661 entries, airplane to zoo 
dtypes: float64(2659), object(2) 

Wenn ich versuche, diese auf der Festplatte zu speichern:

store = pd.HDFStore(p_full_h5) 
store.append('my_df', my_df) 

I erhalten:

File "H5A.c", line 254, in H5Acreate2 
    unable to create attribute 
    File "H5A.c", line 503, in H5A_create 
    unable to create attribute in object header 
    File "H5Oattribute.c", line 347, in H5O_attr_create 
    unable to create new attribute in header 
    File "H5Omessage.c", line 224, in H5O_msg_append_real 
    unable to create new message 
    File "H5Omessage.c", line 1945, in H5O_msg_alloc 
    unable to allocate space for message 
    File "H5Oalloc.c", line 1142, in H5O_alloc 
    object header message is too large 

End of HDF5 error back trace 

Can't set attribute 'non_index_axes' in node: 
/my_df(Group) u''. 

Warum?

Hinweis: Falls es darauf ankommt, sind die Datenrahmen Spaltennamen einfache kleine Strings:

In[12]: max([len(x) for x in list(my_df.columns)]) 
Out{12]: 47 

Das ist alles mit Pandas 0.11 und die neueste stabile Version von IPython, Python und HDF5.

+0

Das Problem ist Ihr Index. Sind sie alle 0? das ist wirklich merkwürdig. Kannst du ein Beispiel deines Rahmens zeigen? – Jeff

+0

im Allgemeinen möchten Sie viel mehr Zeilen als Spalten haben; hdf5 basiert auf Zeilen. Versuchen Sie, die Transponierung Ihres Rahmens zu speichern – Jeff

Antwort

7

HDF5 hat einen Header-Grenzwert von 64 KB für alle Metadaten der Spalten. Dazu gehören Name, Typen usw. Wenn Sie etwa 2000 Spalten verwenden, haben Sie keinen Speicherplatz mehr, um alle Metadaten zu speichern. Dies ist eine grundlegende Einschränkung von Pytables. Ich denke nicht, dass sie bald eine Umgehungslösung auf ihrer Seite haben werden. Sie müssen entweder die Tabelle aufteilen oder ein anderes Speicherformat wählen.

+0

Danke @ BrianWang0. Wenn Sie mein Problem betrachten, haben Sie irgendwelche Vorschläge für Alternativen zu HDF5? –

+0

Interessieren Sie sich für Abfragen oder Anhänge oder Komprimierbarkeit? Versuchen Sie und rufen Sie 'my_df.to_hdf (output_name, 'my_df', format = 'f')'. Ich bin kein Experte in PyTables, aber es funktionierte für mich, als ich eine riesige Anzahl von Spalten hatte. Irgendwie _fixed_ Format hat diese Einschränkung nicht als _table_ Format. Das war die einfachste Lösung für mich. – BrianWang0

+1

Oder Sie können die Tabelle aufteilen, indem Sie mehrere Datenrahmen aus einem Datenrahmen erstellen. Jeder Datenrahmen hat eine Teilmenge aller Spalten. Speichern Sie jeden Datenrahmen in einem HDF5-Speicher. Oder schreibe es einfach in einen einfachen Text csv, wenn du nur die einfachste Lösung willst. Auch hier bin ich kein Experte. Jemand anderes könnte wahrscheinlich einen viel besseren Vorschlag machen als ich. – BrianWang0

4

Ab 2014 die hdf ist updated

 
If you are using HDF5 1.8.0 or previous releases, there is a limit on the number 
of fields you can have in a compound datatype. 
This is due to the 64K limit on object header messages, into which datatypes are encoded. (However, you can create a lot of fields before it will fail. 
One user was able to create up to 1260 fields in a compound datatype before it failed.) 

Was pandas, kann es Datenrahmen mit arbirtary Anzahl der Spalten mit format='fixed' Option, Format 'table' noch wirft die gleichen Fehler wie in Thema speichern. Ich habe auch versucht h5py, und bekam den Fehler 'zu großen Header' (obwohl ich Version> 1.8.0 hatte).