2017-01-25 188 views
2

pythonのh5pyパッケージに軽微な問題があります。私は次元(num_images x color_channels x幅x高さ)の配列としてhdf5ファイルに格納された非常に大きなデータセット(約250kの小さな画像断片)を扱っていますh5pyの読み込み速度を向上させる

このデータセットはトレーニングと検証にランダムに分けられていますデータ。したがって、分類器を訓練するときに、このデータのランダムな要素を読み取る必要があります。

データセット全体(250kの画像すべて)をロードすると、このデータの特定のサブセットを読み出すよりもはるかに速いという奇妙な発見ができました。具体的には、のように配列全体を読み取る:

indices = [3, 23, 31, 105, 106, 674, ...] 
data = h5py.File("filename.h5", "r")["images"][indices, :, :, :] 

data = h5py.File("filename.h5", "r")["images"][:] 

する高速Iは、これらの画像(25K画像)のみランダム、非連続部分集合を読み出す場合よりも5の約倍であります

これは仕様ですか?それはhdf5ファイルの圧縮によるものですか?

答えて

3

http://docs.h5py.org/en/latest/high/dataset.html#fancy-indexing

numpyのファンシー・インデックス構文のサブセットがサポートされています。根底にあるHDF5のメカニズムは期待したものとは異なるパフォーマンスを持つ可能性があるため、注意して使用してください。

非常に長いリスト(> 1000個の要素)パフォーマンスの低下

高度なインデックスを生成することが必要で、その後ようにいくつかの距離をスキップし、別のものを読んで、ここではデータのブロックを読み込みます。そのデータがすべてデータバッファのようにメモリ内にある場合、1つの連続ブロック内の同じバイト数を読み込むよりも遅くても、比較的高速に実行できます。そのデータがファイル内にある場合は、ファイルシークとブロック読み込みを含める必要があります。また

あなたはチャンキングと圧縮を使用している場合:

チャンキングは、パフォーマンスに影響があります。大規模なデータセットの場合は、チャンクの合計サイズを10 KiBから1 MiBの間で保持することをお勧めします。チャンク内の要素にアクセスすると、チャンク全体がディスクから読み込まれることにも注意してください。

イメージを個別のデータセットとして保存するとパフォーマンスが向上するのではないかと思います。その後、1次元指標ではなく名前で検索します。あなたはそれらを4Dアレイに参加させなければならないでしょうが、私はh5pyがそれをどうにかしなければならないと思っています(個別に読むでしょう)。

関連する問題