【问题标题】:Performance issue with loop on datasets with h5py使用 h5py 对数据集进行循环的性能问题
【发布时间】:2013-09-28 11:34:13
【问题描述】:

我想对 hdf5 文件中包含的数据集应用一个简单的函数。 我正在使用类似于此的代码

import h5py
data_sums = []

with h5py.File(input_file, "r") as f:
    for (name, data) in f["group"].iteritems():
        print name
        # data_sums.append(data.sum(1))
        data[()]  # My goal is similar to the line above but this line is enough
                  # to replicate the problem

它在开始时非常快,在一定数量(在某种程度上可重现)的数据集之后,它会显着减慢。 如果我评论最后一行,它几乎立即完成。数据是否存储(此处附加到列表)并不重要:类似于 data[:100] 的类似效果。 在性能下降之前可以处理的数据集数量取决于每次迭代时访问的部分的大小。 迭代更小的块并不能解决问题。

我想我正在填充一些内存空间,并且当它已满时进程会变慢,但我不明白为什么。

如何规避这个性能问题?

我在 ubuntu 10.04 上运行 python 2.6.5。

编辑: 如果循环的第二行未注释,则以下代码不会减慢速度。没有它,它确实会变慢

f = h5py.File(path to file, "r")
list_name = f["data"].keys()
f.close()

import numpy as np

for name in list_name:
    f = h5py.File(d.storage_path, "r")
    # name = list_name[0] # with this line the issue vanishes.
    data = f["data"][name]
    tag = get_tag(name)
    data[:, 1].sum()
    print "."

    f.close()

编辑:我发现访问多维数据集的第一维似乎没有问题。当涉及更高维度时,就会出现问题。

【问题讨论】:

    标签: python performance memory-management hdf5 h5py


    【解决方案1】:

    平台?

    在 windows 64 位 python 2.6.6 上,如果您以小块分配它,我在跨越 2GB 障碍时(我认为)看到了一些奇怪的问题。

    你可以用这样的脚本来查看它:

    ix = []
    for i in xrange(20000000):
        if i % 100000 == 0:
            print i
        ix.append('*' * 1000)
    

    你可以看到它会在一段时间内跑得很快,然后突然变慢。

    但如果你在更大的块中运行它:

    ix = []
    for i in xrange(20000):
        if i % 100000 == 0:
            print i
        ix.append('*' * 1000000)
    

    它似乎没有问题(尽管它会耗尽内存,具体取决于你有多少 - 这里是 8GB)。

    更奇怪的是,如果你用大块吃掉内存,然后再清空内存(ix=[],所以回到几乎没有使用的内存),然后重新运行小块测试,它是'不再慢了。

    我认为对 pyreadline 版本有一定的依赖性 - 2.0-dev1 对这些问题有很大帮助。但不要记得太多。当我现在尝试它时,我真的不再看到这个问题 - 两者都在 4.8GB 左右显着减慢,这与我运行的所有其他东西有关,它达到了物理内存的限制并开始交换。

    【讨论】:

    • 我在 ubuntu 10.04 上运行 python 2.6.5。你建议我更新我的 python 发行版吗?
    • 即使我没有将数据存储在列表中,我也会遇到类似的性能问题。访问它们就足够了,并且内存使用率一直保持在较低的百分比。
    • 嗯,2.6.6 有一些 2.6.5 没有的安全修复程序,但它不应该有任何区别。您是否有可能只有不同长度的数据?即运行它并打印出 len(data) 并查看长度是否发生显着变化会很有用......
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2018-05-14
    • 2019-07-02
    • 2021-08-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多