我有一个2D数据集,它以合理的分块方式存储在HDF5文件中。我按如下方式访问它:
f = h5py.File("mydata.h5", "r")
data = f.get("mydata")
其中data.shape〜(1.e6,3000)和data.dtype ='float32'
我想基于一维有效索引的一维列表创建一个子集:
valid_mask = np.load("valid.npy") # values 1 or 0, length ~ 1.e6, np.sum(valid_mask) = 300000
valid_indices = np.where(valid_mask)
data_clean = data[valid_indices]
现在,如果我将valid_indices的长度限制为总列表的一小部分,则上述代码将起作用。例如valid_indices = np.where(valid_mask[:maxlength]
。实际上,如果使用maxlength=10000
,则速度非常快。但是随着maxlength
的增加,它变得极其缓慢。特别是,maxlength=100000
大约需要1分钟(约占总数据集的10%),但是如果我将maxlength
仅增加3倍,则需要花费7倍的时间,而事实并非如此。一旦maxlength
接近len(valid_mask)
我意识到data
需要从磁盘上的HDF5文件中读取,因为它是子集,但是要对整个数据集执行此操作所需的时间比花费的时间长了 只需按顺序读取原始的12 GB文件即可。
我开始怀疑使用强力for
循环会比我上面想做的要快,但是我不知道为什么。任何对此为何陷入困境的见解将不胜感激。