我将数据存储在HDF5文件中的大型4-D阵列中。每个文件的尺寸是(时间,x,y,z)。我想加载时间列的一个子集,其中包含x,y,z值的一些,以获得2D(T,位置)矩阵。我有一个3D逻辑掩码,用于我想要加载的所有x,y,z位置。我的问题是:我最好将我存储的数据重新格式化为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)。
发生了什么事?加速的来源是什么?我什么时候能指望它发生?
感谢任何见解。