2012-06-25 5 views
15

Ich weiß, dass ein SO-Benutzer diese question früher gefragt hat, aber es wurde 2009 gefragt, und ich hoffte, dass mehr Kenntnisse von HDF5 verfügbar waren oder neuere Versionen dieses spezielle Problem behoben hatten. Um die Frage hier bezüglich meines eigenen Problems neu zu stellen;Löschen von Informationen aus einer HDF5-Datei

Ich habe eine riesige Datei von Knoten und Elemente aus einer großen Geometrie und habe bereits alle nützlichen Informationen, die ich brauche, von ihm abgerufen. Daher versuche ich in Python, die ursprüngliche Datei beizubehalten, lösche jedoch die Informationen, die ich nicht benötige, und fülle weitere Informationen für andere Quellen aus. Zum Beispiel habe ich einen Datensatz von Knoten, die ich nicht brauche. Ich muss jedoch den benachbarten Datensatz beibehalten und Informationen zu ihren Indizes aus einer externen Datei hinzufügen. Gibt es eine Möglichkeit, diese spezifischen Datensätze zu löschen?

Oder ist die alte Idee, "Platzhalter" in der HDF5-Datei zu haben immer noch wahr, so dass niemand weiß, wie/stört mit dem Entfernen von Informationen? Ich mache mir keine Sorgen wegen des leeren Raums, solange es schneller ist, einfach Informationen zu entfernen und hinzuzufügen, um eine völlig neue Datei zu erstellen.

Hinweis: Ich benutze H5py 'r +' zu lesen und zu schreiben.

Antwort

15

Entfernen von ganzen Knoten (Gruppen oder Datasets) aus einer hdf5-Datei sollte kein Problem sein.
Wenn Sie jedoch den Speicherplatz zurückfordern möchten, müssen Sie das h5repack-Tool ausführen.

Vom hdf5 docs:

5.5.2. einen Datensatz aus einer Datei und Reclaiming Raum löscht

HDF5 zu diesem Zeitpunkt keinen einfachen Mechanismus bietet einen -Datensatz aus einer Datei zu entfernen oder den Speicherplatz von einem gelöschte Objekt besetzt zurückzuzufordern.

Das Entfernen eines Datensatzes und das Zurückfordern des verwendeten Speicherplatzes kann mit der H5Ldelete-Funktion und dem Hilfsprogramm h5repack erfolgen. Mit der Funktion H5Ldelete können Verknüpfungen zu einem Dataset aus der Struktur entfernt werden. Nachdem alle Verknüpfungen entfernt wurden, wird der Datensatz für keine Anwendung mehr zugänglich und wird effektiv aus der Datei entfernt. Die Methode zum Wiederherstellen des von einem nicht verknüpften Dataset belegten Speicherplatzes lautet , um alle Objekte der Datei in eine neue Datei zu schreiben. Jedes nicht verknüpfte Objekt ist für die Anwendung nicht zugänglich und wird nicht in die neue Datei aufgenommen. Das Schreiben von Objekten in eine neue Datei kann mit einem benutzerdefinierten Programm oder mit dem Hilfsprogramm h5repack erfolgen.

Alternativ können Sie auch in PyTables ptrepack Werkzeug suchen. PyTables sollte h5py hdf5-Dateien lesen können und das ptrepack-Tool ähnelt dem h5repack.

Wenn Sie Datensätze aus einem Datensatz entfernen möchten, müssen Sie wahrscheinlich die Datensätze abrufen, die Sie behalten möchten, und einen neuen Datensatz erstellen und den alten Datensatz entfernen.
PyTables unterstützt removing Zeilen, aber es wird nicht empfohlen.

+1

Vielen Dank für die detaillierte Erklärung und hilfreiche Links! Genau das habe ich gebraucht. – Ason

+1

Danke. Dies ist immer noch der Fall. Programmgesteuert [hier] (https://github.com/jackdotwa/python-concepts/blob/master/hdf5/reclaiming_space.ipynb). –

0

Wenn Sie wissen, dass ein bestimmtes Dataset am Ende eines Analyseprozesses entfernt wird, warum sollte es dann in der Master-Datei bleiben? Ich würde die temporären Daten in einer separaten HDF5-Datei speichern, die nach Abschluss der Analyse verworfen werden könnte.Wenn es wichtig ist, das temporäre Dataset in der Master-Datei zu verknüpfen, erstellen Sie einfach eine externe Verknüpfung zwischen dem Master und dem Temp mithilfe von H5Lcreate_external(). Externe Links beanspruchen einen geringen Platzbedarf.