【发布时间】:2020-04-27 07:21:51
【问题描述】:
我有可能超过 50 Gb 的 HDF5 文件。我只对获取顶级组之一中所有组的名称感兴趣。例如,
f = h5py.File('my_file.hdf')
names = f['top_level_group'].keys()
有超过 1,000,000 个组,运行上述代码需要数小时才能完成。有没有办法在合理的时间内做到这一点?我觉得简单地获取所有组的名称应该不会超过几秒钟。
编辑
我的实际生产代码是 C++ 并使用 C++ hdf5 API,其中包括函数GetObjnameByIdx()。这让我可以计算读取每个单独的组名并输出到日志文件所需的时间。我在周末让它运行,代码仍然没有完成。到目前为止,我的计时结果如下:
起初,代码以每组大约 1-1.5 毫秒开始。这对我来说似乎很慢,因为这意味着阅读所有组大约需要 30-35 分钟。无论如何,不久之后,它是 2 毫秒(此时,我周末回家,想在星期一之前得到完整的图表)。
Lo',我错了。请注意,这是一个半对数图,对数形状实际上代表线性趋势。有趣的是,在某些时候,它突然从每次读取 10 毫秒跃升至每次读取 2.5 秒(跳跃时间高达 25 秒!)。日志中的读取时间总和为 64.5 小时。
我无法在我生成的其他文件中重现此问题(不过,我们至少有 3 个生产文件存在此问题)。我生成的文件与有问题的生产文件具有相同的大小和结构,并且我使用生产代码中的相同功能生成了它们。加载这些测试文件需要 1-2 秒。
我知道文件并没有完全损坏,因为我们确实会得到结果,只要我们让它运行完成。数据就在那里,只是需要很长时间才能访问。
此时,由于我无法在测试文件中重现该问题,因此我的问题对于 StackOverflow 可能是无效的,但我完全不知道应该做什么。
【问题讨论】:
-
用
h5ls -r myfile.hdf列出所有组需要多长时间?这给出了可能的下限的想法。 -
从当前的打印速度推断,很可能需要一两个小时。但是,仅访问组名本身应该比打印出来要快几个数量级。
-
尝试重定向到 /dev/null。 (
h5ls -r myfile.hdf > /dev/null) 以排除打印和滚动的任何影响。 -
41 分钟 /dev/null 重定向