首页 > 解决方案 > 为什么我的大型 HDF5 数据集花式索引需要这么长时间?

问题描述

我有一个 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但随着增加,它变得非常缓慢。特别是,大约需要 1 分钟maxlength=100000(约占总数据集的 10%),但如果我仅增加 3 倍,则需要 7 倍的时间,而且一旦接近maxlength,它甚至不会在整整一个小时后终止maxlengthlen(valid_mask)

我意识到data需要从磁盘上的 HDF5 文件中读取它,因为它正在被子集化,但是对整个数据集执行此操作所花费的时间简单地顺序读取原始 12 GB 文件所花费的时间要长得多。

我开始怀疑使用蛮力for循环会比我在上面尝试做的更快,但我不知道为什么。任何有关为什么会陷入困境的见解将不胜感激。

标签: pythonhdf5numpy-ndarray

解决方案


推荐阅读