我将数据存储在 HDF5 文件中的大型 4-D 数组中。每个文件的维度是 (Time,x,y,z)。我想用一些x,y,z 值加载 Time 列的子集,以获得 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 的理解,列出的第二个选项(如果“数据”是 2D 数组)似乎应该加载得更快,因为它从不加载整个数组。在与上述类似的代码的首次通过测试中,它的速度确实快得多(快了大约 10 倍 - 我在真实脚本中进行了时间检查)。
但是,在第一次运行代码后,时间差几乎完全消失了。现在,两个版本的加载速度都快得多,好像 hdf5 文件(或代码的解释器?)以某种方式缓存了完全加载的数据。我不知道它是如何做到的,因为我每次都是在单独的 python 会话中进行的(python MyTestScript.py)。
这是怎么回事?加速的来源是什么?我什么时候可以指望它发生?
感谢您的任何见解。