2

HDF5 ファイルの大きな 4 次元配列に格納されたデータがあります。各ファイルの次元は (Time,x,y,z) です。時間列のサブセットをx、y、z 値の一部と共にロードして、2D (T,location) 行列を取得したいと考えています。ロードしたいすべての x、y、z 位置の 3D 論理マスクがあります。私の質問は、保存されたデータを 2D に再フォーマットしたほうがよいのでしょうか?

hdf5マスキング構文では、論理配列を単一次元のマスクとして使用できますが、複数次元は使用できないため、答えは簡単に「はい」だと思いました。コード例:

MyTestScript.py

import h5py
import numpy as np
# Shape of 'data' variable in h is (900,50,150,150)
sz = (50,150,150)
h = h5py.File('DataStore.hf5')
# Keep 1000 random values
mask = np.hstack((ones(1000),zeros(prod(sz)-1000)))
np.random.shuffle(mask)
mask = mask.reshape(sz)

# 4D array:
masked_data = h['data'].value[:,mask]
# if 'data' were a 2D array instead (900 x 1125000):
masked_data = h['data'][:,mask.flatten()]

h5py に関する私の現在の理解に基づいて、リストされている 2 番目のオプション (「データ」が 2D 配列の場合) は、配列全体をロードすることはないため、はるかに高速にロードする必要があるように見えます。また、上記と同様のコードの最初のパス テストでは、大幅に高速化されます (約 10 倍高速 - 実際のスクリプトでタイミング チェックを行いました)。

ただし、コードの最初の実行後、時間差はほぼ完全になくなります。hdf5ファイル(またはコードのインタープリター?)が完全にロードされたデータを何らかの方法でキャッシュしたかのように、両方のバージョンがはるかに高速にロードされます。毎回別々のpythonセッション(python MyTestScript.py)で行っているため、それがどのように行われているのかわかりません。

どうしたの?高速化のソースは?いつそれが起こると期待できますか?

洞察に感謝します。

4

0 に答える 0