带有h5py的数据集循环的性能问题

时间:2013-09-23 14:12:26

标签: python performance memory-management hdf5 h5py

我想将一个简单的函数应用于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

在开始时非常快,并且在一定程度上可重现的数据集之后,它会显着减慢。 如果我评论最后一行,它几乎立即完成。数据是否存储(此处附加到列表)无关紧要:类似数据[: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()

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

1 个答案:

答案 0 :(得分: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,其中我运行的其他一切都是关于物理内存的限制并开始交换的地方。