2012-06-25 49 views
15

刪除信息,我認識到,一個SO用戶以前問過這個question,但被要求在2009年,我希望有更多的HDF5的知識是可用的或更新的版本已經修復了這個特定的問題。重申關於我自己問題的問題;從HDF5文件

我有節點和元素從一個大的幾何一個巨大的文件,並已檢索到的所有,我從它需要的有用信息。因此,在Python中,我試圖保留原始文件,但刪除了我不需要的信息,併爲其他來源填寫更多信息。例如,我有一個我不需要的節點數據集。但是,我需要保留相鄰數據集並在外部文件中包含有關其索引的信息。有什麼辦法可以刪除這些特定的數據集?

或者在HDF5文件中有「placekeepers」的舊觀念仍持有真實的,這樣,沒有人知道有刪除信息如何/困擾?我不太擔心空白空間,只要簡單地刪除和添加信息然後創建一個全新的文件更快。

注:我使用H5py的「R +」讀寫。

回答

15

從HDF5文件中刪除整個節點(組或數據集)應該沒有問題。
但是,如果您想要回收空間,則必須運行h5repack工具。

hdf5 docs

5.5.2。從文件和回收空間刪除數據集

HDF5不會在這個時候提供一個簡單的機制,從文件中刪除 數據集或回收由 刪除的對象佔用的存儲空間。

刪除數據集並回收它使用的空間可以使用H5Ldelete函數和h5repack實用程序的 完成。使用H5Ldelete函數,可以從文件 結構中刪除指向數據集的鏈接。在刪除所有鏈接後,數據集將變爲 ,任何應用程序均無法訪問該數據集,並且會從 文件中有效刪除。恢復未鏈接數據集佔用的空間的方法是 將文件的所有對象寫入新文件。任何未鏈接的 對象不可訪問應用程序,並且不會包含在 新文件中。將對象寫入新文件可以使用自定義的 程序或使用h5repack實用程序完成。

另外,你也可以看看PyTables的ptrepack工具。 PyTables應該能夠讀取h5py hdf5文件,ptrepack工具類似於h5repack

如果您想要從數據集中刪除記錄,那麼您可能需要檢索要保留的記錄並創建新數據集並刪除舊數據集。
PyTables支持removing行,但不推薦。

+1

非常感謝您的詳細解釋和有用的鏈接!這正是我需要的。 – Ason

+1

謝謝。情況仍然如此。以編程方式探索/確認[這裏](https://github.com/jackdotwa/python-concepts/blob/master/hdf5/reclaiming_space.ipynb)。 –

0

如果您知道某個特定數據集將在分析過程結束時被刪除,爲什麼要將它保存在主文件中呢?我會將臨時數據存儲在一個單獨的HDF5文件中,分析完成後可以將其丟棄。如果在主文件內部鏈接臨時數據集非常重要,只需使用H5Lcreate_external()在主文件和臨時文件之間創建一個外部鏈接即可。外部鏈接消耗一個微不足道的空間。