2013-05-19 10 views
5

Ho un dataframe in Pandas:Impossibile salvare dataframe a HDF5 ("messaggio oggetto intestazione è troppo grande")

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) 

Quando cerco di salvare questo disco:

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

I get:

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''. 

Perché?

Nota: Nel caso in cui le cose, i nomi delle colonne dataframe sono semplici stringhe di piccole dimensioni:

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

Questo è tutto con i panda 0,11 e l'ultima versione stabile di IPython, Python e HDF5.

+0

il problema è il tuo indice. sono tutti 0? è davvero strano puoi mostrare un campione del tuo frame? – Jeff

+0

in generale si desidera avere molte più righe rispetto alle colonne; hdf5 è basato su una riga. prova a memorizzare la trasposizione del tuo frame – Jeff

risposta

7

HDF5 ha un limite di intestazione di 64kb per tutti i metadati delle colonne. Questo include il nome, i tipi, ecc. Quando si percorrono circa 2000 colonne, si esaurirà lo spazio per memorizzare tutti i metadati. Questa è una limitazione fondamentale di pytables. Non penso che faranno soluzioni alternative dalla loro parte in qualunque momento presto. Dovrai dividere il tavolo o scegliere un altro formato di archiviazione.

+0

Grazie @ BrianWang0. Considerando il mio problema, hai qualche suggerimento per le alternative all'HDF5? –

+0

Ti interessa l'interrogazione, l'appendibilità o la compressibilità? Prova e chiama 'my_df.to_hdf (output_name, 'my_df', format = 'f')'. Non sono un esperto di PyTables, ma ha funzionato per me quando avevo un'enorme quantità di colonne. In qualche modo il formato _fixed_ non ha questa limitazione come formato _table_. Questa è stata la soluzione più facile per me. – BrianWang0

+1

Oppure puoi dividere la tabella, come nel caso di più dataframes su un dataframe. Ogni dataframe ha un sottoinsieme di tutte le colonne. Salva ogni dataframe in un archivio HDF5. O semplicemente scrivilo in un semplice testo CSV, se vuoi solo la soluzione più semplice. Ancora una volta, non sono un esperto. Qualcun altro potrebbe probabilmente dare un suggerimento molto migliore di me. – BrianWang0

4

A partire dal 2014, la HDF è 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.) 

Per quanto riguarda pandas, si può risparmiare dataframe con il numero arbirtary di colonne con l'opzione format='fixed', formato 'tabella' alza ancora lo stesso errore come in argomento. Ho anche provato h5py e ho anche ricevuto l'errore di "intestazione troppo grande" (sebbene avessi la versione> 1.8.0).

Problemi correlati