2009-01-15 5 views
1

Je voudrais modifier par programme les données associées à un ensemble de données dans un fichier HDF5. Je n'arrive pas à trouver un moyen de supprimer un jeu de données par son nom (ce qui me permet de l'ajouter à nouveau avec les données modifiées) ou de mettre à jour un jeu de données par son nom. J'utilise l'API C pour HDF5 1.6.x mais des pointeurs vers n'importe quelle API HDF5 seraient utiles.Supprimer ou mettre à jour un jeu de données dans HDF5?

Répondre

5

According to the user guide:

HDF5 n'a pas à ce moment fournir un mécanisme facile à supprimer un jeu de données à partir d'un fichier ou de récupérer l'espace de stockage occupé par un objet supprimé.

Une simple suppression semble hors de question. Mais la section continue:

Suppression d'un ensemble de données et récupérer l'espace utilisé, il peut être fait avec la fonction H5Ldelete et le programme utilitaire h5repack. Avec la fonction H5Ldelete, les liens vers un ensemble de données peuvent être supprimés de la structure de fichiers. Une fois que tous les liens ont été supprimés, l'ensemble de données devient inaccessible à toute application et est effectivement supprimé du fichier. La façon de récupérer l'espace occupé par un ensemble de données non lié consiste à écrire tous les objets du fichier dans un nouveau fichier. Tout objet non lié est inaccessible à l'application et ne sera pas inclus dans le nouveau fichier. L'écriture d'objets dans un nouveau fichier peut être effectuée avec un programme personnalisé ou avec le programme utilitaire h5repack.

+0

Merci. Une idée de comment PyTables (un moteur python construit au-dessus de HDF5) gère cela? –

+0

La documentation pour "modifier" une table dans PyTables est à http://www.pytables.org/moin/HintsForSQLUsers#Alteringatable, mais notez que "(l'ajout d'une colonne) n'est actuellement pas supporté dans PyTables." –

+1

Il est étrange d'obtenir une rétrogradation anonyme cinq ans après avoir répondu à la question, d'autant plus que ma réponse renvoie à la documentation pertinente qui indiquait clairement que c'était impossible en 2009. Cette capacité a-t-elle été ajoutée? –

1

Si vous souhaitez supprimer un ensemble de données en C++ vous devez les commandes suivantes:

H5File m_h5File (pathAndNameToHDF5File, H5F_ACC_RDWR); //The hdf5 c++ object. 
std::string channelName = "/myGroup/myDataset"; 
int result = H5Ldelete(m_h5File.getId(), channelName.data(), H5P_DEFAULT); 
résultat

sera une valeur non-négative en cas de succès; sinon renvoie une valeur négative. https://support.hdfgroup.org/HDF5/doc/RM/RM_H5L.html#Link-Delete

Comme l'a dit @MaxLybbert, l'espace disque n'est pas récupéré. Vous devez utiliser l'outil de remballage. Cependant, avec HDF5 v.1.10, l'espace peut être récupéré. Mais le guide de l'utilisateur n'est pas encore prêt: https://support.hdfgroup.org/HDF5/docNewFeatures/NewFeaturesFileSpaceMgmtDocs.html

Questions connexes