Python h5py数据集上的循环性能问题

Python h5py数据集上的循环性能问题,python,performance,memory-management,hdf5,h5py,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

我想对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()
编辑:我发现访问多维数据集的第一维度似乎没有问题。当涉及更高维度时,问题就会出现。

平台

在Windows64位的Python2.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没有的安全修复,但它不应该有任何区别。您是否可能只是拥有不同长度的数据?i、 运行它并打印出len(数据),看看长度是否有显著变化,这将是非常有用的。。。