为什么花哨的索引需要花费我这么大的HDF5数据集这么长的时间?

时间:2019-11-27 19:00:54

标签: python hdf5 numpy-ndarray

我有一个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循环会比我上面想做的要快,但是我不知道为什么。任何对此为何陷入困境的见解将不胜感激。

0 个答案:

没有答案