(400 x 121000000)HDF5
の非常に大きなデータセットを保存するために使用しています。uint8s
列には大量の冗長性があります (列の 97% は一意ではありません)。重複した列を効率的にマージする必要があります。これは、マージされた列を記憶するためにメタデータを保存しながら、重複する列を削除する必要があることを意味します。
私は現在 Python をh5py
で使用していますが、誰かが効率的な C++ ソリューションを持っている場合は、boost::python
それを実装するために使用できます。
私の現在の解決策は、データ セットのブロックをNumPy
配列に読み込み、 a を使用しdictionary
て一意の列とメタデータを格納することです。
注: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
私は助けが必要です; これは最適ではありません。
ありがとう!