10
votes

Impossible d'enregistrer DataFrame à HDF5 ("" Message d'en-tête d'objet est trop grand ")

J'ai un Dataframe dans Pandas: xxx

Lorsque j'essaie de sauvegarder ceci sur le disque: xxx

i get: xxx

pourquoi?

Remarque: Dans le cas où il importe, les noms de colonne Dataframe sont de simples petites chaînes: xxx

c'est tout avec des pandas 0.11 et la dernière version stable d'Ipython, Python et HDF5.


2 commentaires

Le problème est votre index. sont-ils tous 0? C'est vraiment étrange. Pouvez-vous montrer un échantillon de votre cadre?


En général, vous voulez avoir beaucoup plus de lignes que de colonnes; HDF5 est basé sur la ligne. Essayez de stocker la transpose de votre cadre


4 Réponses :


13
votes

HDF5 a une limite d'en-tête de 64 Ko pour toutes les métadonnées des colonnes. Ceci inclut le nom, les types, etc. Lorsque vous allez environ 2000 colonnes, vous manquerez d'espace pour stocker toutes les métadonnées. C'est une limitation fondamentale des pytables. Je ne pense pas qu'ils feront des solutions de contournement de leur côté à tout moment. Vous devrez soit diviser la table ou choisir un autre format de stockage.


3 commentaires

Merci @ brianwang0. Considérant mon problème, avez-vous des suggestions d'alternatives à HDF5?


Vous souciez-vous de l'interrogation ou de l'appépendabilité ou de la compressibilité? Essayez d'appeler my_df.to_hdf (nom_do_name, 'my_df', format = 'f') . Je ne suis pas un expert en pytables, mais cela a fonctionné pour moi quand j'avais énormément de colonnes. D'une manière ou d'une autre Fixe Format n'a pas cette limitation comme format Table . C'était la solution la plus facile pour moi.


Ou vous pouvez diviser la table, comme dans Créer plusieurs dataframes sur un fichier de données. Chaque Dataframe a un sous-ensemble de toutes les colonnes. Enregistrez chaque Dataframe dans un HDF5Store. Ou écrivez-le simplement à un texte simple CSV, si vous voulez simplement la solution la plus simple. Encore une fois, je ne suis pas un expert. Quelqu'un d'autre pourrait probablement donner une meilleure suggestion que moi.



5
votes

A partir de 2014, le HDF est Mise à jour

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


0 commentaires

8
votes

Bien que ce fil ait plus de 5 ans, le problème est toujours pertinent. Il n'est toujours pas possible d'enregistrer un fichier de données avec plus de 2000 colonnes comme une table dans un HDFstore. En utilisant format = 'corrigé' n'est pas une option si on veut choisir les colonnes à lire à partir du HDFStore ultérieurement.

Voici une fonction qui divise le Dataframe en plus petits et les stocke comme tables séparées. En outre, un pandas.series est mis à la HDFStore contenant les informations à quel tableau une colonne appartient une colonne. xxx

Dataframes stockés dans un HDFStore avec le La fonction ci-dessus peut être lue avec la fonction suivante. xxx


0 commentaires

0
votes
###USE get_weights AND set_weights TO SAVE AND LOAD MODEL, RESPECTIVELY.

##############################################################################

#Assuming that this is your model architecture. However, you may use 
#whatever architecture, you want to (big or small; any).
def mymodel():
    inputShape= (28, 28, 3);
    model= Sequential()
    model.add(Conv2D(20, 5, padding="same", input_shape=inputShape))
    model.add(Activation('relu'))
    model.add(Flatten())
    model.add(Dense(500))
    model.add(Activation('relu'))
    model.add(Dense(2, activation= "softmax"))
    return model
model.fit(....)    #paramaters to start training your model




################################################################################
################################################################################
#once your model has been trained, you want to save your model in your PC
#use get_weights() command to get your model weights
weigh= model.get_weights()

#now, use pickle to save your model weights, instead of .h5
#for heavy model architectures, .h5 file is unsupported.
pklfile= "D:/modelweights.pkl"
try:
    fpkl= open(pklfile, 'wb')    #Python 3     
    pickle.dump(weigh, fpkl, protocol= pickle.HIGHEST_PROTOCOL)
    fpkl.close()
except:
    fpkl= open(pklfile, 'w')    #Python 2      
    pickle.dump(weigh, fpkl, protocol= pickle.HIGHEST_PROTOCOL)
    fpkl.close()




################################################################################
################################################################################
#in future, you may want to load your model back
#use pickle to load model weights

pklfile= "D:/modelweights.pkl"
try:
    f= open(pklfile)     #Python 2

    weigh= pickle.load(f);                
    f.close();
except:

    f= open(pklfile, 'rb')     #Python 3                 
    weigh= pickle.load(f);                
    f.close();

restoredmodel= mymodel()
#use set_weights to load the modelweights into the model architecture
restoredmodel.set_weights(weigh)




################################################################################
################################################################################
#now, you can do your testing and evaluation- predictions
y_pred= restoredmodel.predict(X)

2 commentaires

Cette réponse serait meilleure que vous avez ajouté une brève description de la manière dont il résout le problème!


Cette réponse est hors sujet. Un petit extrait runnable sur la manière de sauvegarder / charger un fichier de données de pandas au format de cornichon, ainsi qu'une discussion sur les compromis entre cornichons et HDF5 serait accueillie.