2009-07-14 143 views
14

我有一個具有一維(N×1)複合元素數據集的HDF5文件 - 實際上它是一個時間序列。數據首先離線收集到HFD5文件中,然後進行分析。在分析過程中,大部分數據變得毫無趣味,而且只有一部分是有趣的。由於數據集可能很大,我希望擺脫無趣的元素,同時保留有趣的元素。例如,保留500個元素數據集中的元素0-100和200-300以及350-400,轉儲其餘元素。但是如何?從HDF5文件中刪除數據

有沒有人對HDF5如何實現這一點有經驗?顯然它可以通過幾種方式完成,至少:

  • (明顯的解決方案),創建一個新的新文件,並在那裏寫入必要的數據,逐個元素。然後刪除舊文件。
  • 或者,在舊文件中創建一個新的新數據集,在那裏寫入必要的數據,使用H5Gunlink()取消舊數據集的鏈接,然後通過h5repack運行文件來擺脫未聲明的可用空間。或者,將現有數據集中感興趣的元素移向起點(例如,將元素200-300移動到位置101-201,將元素350-400移動到位置202-252)。然後調用H5Dset_extent()來減小數據集的大小。然後可能會通過h5repack來釋放可用空間。

由於文件可能相當大,即使不感興趣的元素已被刪除,我寧願不重寫它們(這將需要很長時間),但似乎需要實際釋放可用空間。 HDF5專家的任何提示?

回答

8

HDF5(至少是我習慣的版本,1.6.9)不允許刪除。實際上,它確實存在,但它並沒有釋放已用空間,導致您仍然擁有一個巨大的文件。正如你所說,你可以使用h5repack,但這是浪費時間和資源。

你可以做的一件事就是讓橫向數據集包含一個布爾值,告訴你哪些值是「活着的」,哪些值已被刪除。這並不會使文件變小,但至少可以讓您快速執行刪除操作。

另一種方法是在你的數組中定義一個slab,複製相關數據,然後刪除舊數組,或者總是通過slab訪問數據,然後根據需要重新定義它(我從來沒有做過,儘管如此,我不確定是否有可能,但它應該)

最後,您可以使用hdf5掛載策略將您的數據集放入您掛接在根hdf5上的「附加」hdf5文件中。當你想刪除東西時,將有趣的數據複製到另一個裝入的文件中,卸載舊文件並將其刪除,然後將新文件重新裝入正確的位置。這個解決方案可能很麻煩(因爲你有多個文件),但是它允許你釋放空間並且只在數據樹的子部分上運行,而不是使用重新打包。

+0

謝謝你的想法。這確實可以通過許多方式來完成。希望有一天真正的刪除功能將被添加到HDF5,不得不像這樣亂糟糟地刪除東西幾乎是荒謬的......但除此之外,它是一種很好的文件格式:-) – 2009-07-15 06:38:19

1

不幸的是,如上所述複製數據或使用h5repack是兩種常見的方法,即在HDF5文件中「縮小」數據。

這個問題你可能已經猜到了,HDF5文件的內部結構很複雜(文件格式爲here,對於任何好奇的人),所以刪除和縮小的東西只會留下相同大小的孔文件。 HDF5庫的最新版本可以跟蹤已釋放的空間並重新使用它,但您的用例似乎無法利用該空間。

正如其他答案所提到的,您可能可以使用外部鏈接或虛擬數據集功能來構建更適合您將要進行的操作的HDF5文件,但我懷疑您仍然會要複製大量數據,這肯定會增加額外的複雜性和文件管理開銷。順便提一下,H5Gunlink()已被棄用。 H5Ldelete()是首選的替代品。