python/h5pyを使用してhdf5ファイルに最適に書き込む方法についての質問があります。
私は次のようなデータを持っています:
-----------------------------------------
| timepoint | voltage1 | voltage2 | ...
-----------------------------------------
| 178 | 10 | 12 | ...
-----------------------------------------
| 179 | 12 | 11 | ...
-----------------------------------------
| 185 | 9 | 12 | ...
-----------------------------------------
| 187 | 15 | 12 | ...
...
約10 ^ 4列、約10 ^ 7行。 (これは約10 ^ 11(1,000億)の要素、つまり1バイト整数で約100GB).
このデータを使用すると、通常の使用はほぼ1回書き込み、何度も読み取ります。一般的な読み取りの場合は、列1と別の列(たとえば254)を取得し、両方の列をメモリにロードして、いくつかの空想的な統計を行います。
したがって、上記の表の各列をhdf5グループにして、結果として10 ^ 4グループにするのが、良いhdf5構造になると思います。そうすれば、すべてのデータをメモリに読み込む必要がなくなりますね。 hdf5構造はまだ定義されていないため、何でもかまいません。
ここで質問:一度に最大10 ^ 4行のデータを受け取り(毎回まったく同じ行数ではない)、hdf5ファイルにインクリメンタルに書き込む必要があります。そのファイルを書き込むにはどうすればよいですか?
pythonとh5pyを検討していますが、推奨されている場合は別のツールを使用することもできます。
dset = f.create_dataset("voltage284", (100000,), maxshape=(None,), dtype='i8', chunks=(10000,))
10 ^ 4行の別のブロックが到着したら、データセットを置き換えますか?
それとも、10 ^ 4行の各ブロックを個別のデータセットとして保存する方が良いですか?または、本当に最終的な行数を知る必要がありますか? (それは得るのが難しいでしょうが、おそらく可能です)。
Hdf5も、その仕事に適したツールではない場合は、保釈できますが、厄介な書き込みが行われると、すばらしいことになると思います。
FAQに従って 、dset.resize
を使用してデータセットを拡張できます。例えば、
import os
import h5py
import numpy as np
path = '/tmp/out.h5'
os.remove(path)
with h5py.File(path, "a") as f:
dset = f.create_dataset('voltage284', (10**5,), maxshape=(None,),
dtype='i8', chunks=(10**4,))
dset[:] = np.random.random(dset.shape)
print(dset.shape)
# (100000,)
for i in range(3):
dset.resize(dset.shape[0]+10**4, axis=0)
dset[-10**4:] = np.random.random(10**4)
print(dset.shape)
# (110000,)
# (120000,)
# (130000,)
@unutbuが指摘したように、dset.resize
は優れたオプションです。 pandas
とその HDF5 サポートを確認することは、ワークフローに応じて役立つ可能性があります。あなたのニーズを考えると、HDF5が妥当な選択のように思えますが、上に追加のレイヤーを使用すると、問題がよりよく表現される可能性があります。
考慮すべき1つの重要なことは、データの方向です。主に読み取りに関心があり、主に列ごとにデータをフェッチする場合、HDF5が行優先で格納されるため、行ごとに読み取りが行われるようにデータを転置した方がよいように思えます。