web-dev-qa-db-ja.com

h5pyを使用したhdf5への増分書き込み

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も、その仕事に適したツールではない場合は、保釈できますが、厄介な書き込みが行われると、すばらしいことになると思います。

24
user116293

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,)
27
unutbu

@unutbuが指摘したように、dset.resizeは優れたオプションです。 pandasとその HDF5 サポートを確認することは、ワークフローに応じて役立つ可能性があります。あなたのニーズを考えると、HDF5が妥当な選択のように思えますが、上に追加のレイヤーを使用すると、問題がよりよく表現される可能性があります。

考慮すべき1つの重要なことは、データの方向です。主に読み取りに関心があり、主に列ごとにデータをフェッチする場合、HDF5が行優先で格納されるため、行ごとに読み取りが行われるようにデータを転置した方がよいように思えます。

7
daniel