2010-08-23 91 views
13

我需要以某種方式在磁盤上存儲512^3陣列,而我目前使用HDF5。由於陣列稀疏,很多磁盤空間被浪費了。HDF5中的稀疏陣列支持

HDF5是否提供對稀疏數組的支持?

+0

[本答案] [1]提供了一個(僅限Python)解決方案。 [1]:http://stackoverflow.com/a/22589030/2858145 – 2014-03-23 13:55:32

回答

2

分塊數據集(H5D_CHUNKED)允許貯疏但根據您的數據,開銷可能是重要的。

取一個典型的數組,並嘗試稀疏和非稀疏,然後比較文件大小,然後你會看到它是否真的值得。

+1

是的,[this](http://mail.hdfgroup.org/pipermail/hdf-forum_hdfgroup.org/2010-March/002704.html)後解釋瞭如何做到這一點(或者怎麼做_not_)謝謝 – andreabedini 2011-03-02 03:36:32

12

一種解決方法是用compression option創建數據集。例如,在Python中使用h5py

import h5py 
f = h5py.File('my.h5', 'w') 
d = f.create_dataset('a', dtype='f', shape=(512, 512, 512), fillvalue=-999., 
        compression='gzip', compression_opts=9) 
d[3, 4, 5] = 6 
f.close() 

生成的文件是4.5 KB。沒有壓縮,這個相同的文件將是大約512 MB。這是一個99.999%的壓縮,因爲大部分數據是-999.(或任何你想要的fillvalue)。


等效可以通過設置H5::DSetCreatPropList::setDeflate至9,用example shown in h5group.cpp使用C++ HDF5 API來實現。

+0

儘管分析確實是在python中完成的,但是hdf5文件是用C++生成的,因此h5py不是一個選項。是由hdf5原生支持的相同種類的壓縮嗎?我知道pytables和h5py支持額外的壓縮協議。 – andreabedini 2014-09-28 06:19:58

+1

@andreabedini我已經更新了答案,並鏈接到了一個C++示例,該示例使用相同的技術。我確信數據集必須被分塊以啓用壓縮。 – 2014-09-28 20:58:06

+0

從答案開始時的[HDF5鏈接](http://docs.h5py.org/en/latest/high/dataset.html#chunked-storage):「分塊存儲可以調整數據集的大小,並且因爲數據存儲在固定大小的塊中,所以要使用壓縮過濾器。「所以,是的,壓縮需要分塊。 – hBy2Py 2015-07-06 17:48:18