python - 为什么我的大型 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
,它甚至不会在整整一个小时后终止maxlength
len(valid_mask)
我意识到data
需要从磁盘上的 HDF5 文件中读取它,因为它正在被子集化,但是对整个数据集执行此操作所花费的时间比简单地顺序读取原始 12 GB 文件所花费的时间要长得多。
我开始怀疑使用蛮力for
循环会比我在上面尝试做的更快,但我不知道为什么。任何有关为什么会陷入困境的见解将不胜感激。
解决方案
推荐阅读
- ios - IOS Metal Fragment shader文件编译
- java - 有没有办法在 Java 中记录失败的 Oracle 登录的用户名?
- r - 按 ID 合并两个数据集,而不添加“.x”或“.y”的新列
- reactjs - 在 React 自定义钩子中 onChange 时验证输入的最佳实践?
- javascript - 一次处理多个网址(点击)
- javascript - Javascript替换字符串并替换字符串
- python - 将字符串转换为数据帧可读
- python - 无法从 python 设置 pythonpath 环境变量
- algorithm - 通过任意权重函数找到最佳路径?
- python - Scrapy Crawler 不跟随链接