我HDF5
用来存储非常大的数据集uint8s
(400 x 121000000)。列中存在大量冗余(97% 的列不是唯一的)。我需要有效地合并重复的列。这意味着我需要删除重复的列,同时存储元数据以记住合并了哪些列。
我目前正在使用 Python h5py
,但如果有人有一个高效的 C++ 解决方案,我可以简单地使用boost::python
它来实现它。
我当前的解决方案包括将数据集的块加载到NumPy
数组中并使用 adictionary
来存储唯一列和元数据。
注意:HashableNDArray
课程可以在这里找到。我只是重命名了它。
def find_column_redundancy(dataset):
n_columns = dataset.shape[1]
block_size = 500000
n_blocks = int(ceil(float(n_columns) / float(block_size)))
d = {}
analysed_column_count = 0
for block in xrange(n_blocks):
block_offset = block*block_size
block_data = dataset[:, block_offset : block_offset+block_size]
for i in xrange(block_data.shape[1]):
hashable_array = HashableNDArray(np.ascontiguousarray(block_data[:, i]))
d[hashable_array] = np.append(d.get(hashable_array, np.array([], dtype=np.int32)), block_offset + i)
analysed_column_count += 1
return d
遍历完所有列后,我返回一个dictionary
用于编写HDF5
删除冗余的新数据集的 a。
我需要帮助; 这不可能是最佳的!
谢谢!