HDF5 に保存し、PyTables を使用してアクセスするかなり大きなデータセットがあります。このデータセットに対して実行する必要がある操作の 1 つは、各要素間のペアごとの比較です。これには 2 つのループが必要です。1 つは各要素を反復するループで、内側のループは他のすべての要素を反復するループです。したがって、この操作では N(N-1)/2 の比較が行われます。
かなり小さいセットの場合、内容を多次元のnumpy配列にダンプしてから反復を行う方が高速であることがわかりました。メモリの問題が原因で大規模なセットで問題が発生し、実行時にデータセットの各要素にアクセスする必要があります。
要素を配列に入れると、1 秒あたり約 600 回の比較が行われますが、hdf5 データ自体を操作すると、1 秒あたり約 300 回の比較が行われます。
このプロセスをスピードアップする方法はありますか?
例は次のとおりです(これは私の実際のコードではなく、単なる例です):
スモールセット:
with tb.openFile(h5_file, 'r') as f:
data = f.root.data
N_elements = len(data)
elements = np.empty((N_elements, 1e5))
for ii, d in enumerate(data):
elements[ii] = data['element']
D = np.empty((N_elements, N_elements))
for ii in xrange(N_elements):
for jj in xrange(ii+1, N_elements):
D[ii, jj] = compare(elements[ii], elements[jj])
大型セット:
with tb.openFile(h5_file, 'r') as f:
data = f.root.data
N_elements = len(data)
D = np.empty((N_elements, N_elements))
for ii in xrange(N_elements):
for jj in xrange(ii+1, N_elements):
D[ii, jj] = compare(data['element'][ii], data['element'][jj])