Python字典太满或其他什么?

时间:2013-06-21 17:42:03

标签: python dictionary h5py

我有大约1300个h5文件使用h5py排序到字典中。当我在大约250个文件上运行我的代码时它可以正常工作,但任何更大的数量都会给我带来错误:

  Traceback (most recent call last):
    File "solution_script.py", line 31, in <module>
    File "build/bdist.macosx-10.7-intel/egg/h5py/_hl/files.py", line 165, in __init__
    File "build/bdist.macosx-10.7-intel/egg/h5py/_hl/files.py", line 57, in make_fid
    File "h5f.pyx", line 70, in h5py.h5f.open (h5py/h5f.c:1626)
  IOError: unable to open file (File accessability: Unable to open file)'

我不确定我是否错误地设置了字典,或者是否有更好的方法来执行此操作。

如果有人能看到我犯过的一些明显错误,那么这是我的代码:

nodesDictionary = {}
velDictionary = {}
cellsDictionary={}
num_h5file = -1;
for root, directory, files in os.walk(rootDirectory):
    for file in sorted(files):
        if file.endswith(".h5"):
            num_h5file = num_h5file + 1
                curh5file = h5py.File(file, 'r')
                nodes_list = curh5file["nodes"]
                cells_list = curh5file["cells"]
                velocity_list = curh5file["velocity"]
                for i in range(0, len(nodes_list)-1):
                    if num_h5file not in nodesDictionary:
                            nodesDictionary[num_h5file] = [curh5file["nodes"][i]]
                            velDictionary[num_h5file] = [curh5file["velocity"][i]]                         
                    else:
                            nodesDictionary[num_h5file].append(curh5file["nodes"][i])
                            velDictionary[num_h5file].append(curh5file["velocity"][i])
                for j in range(0, len(cells_list)-1):
                    if num_h5file not in cellsDictionary:
                            cellsDictionary[num_h5file] = [curh5file["cells"][j]]
                    else:
                            cellsDictionary[num_h5file].append(curh5file["cells"][j])

非常感谢任何帮助/建议/见解:)

2 个答案:

答案 0 :(得分:3)

我同意@reptilicus,你最好的办法是尽可能关闭你没有积极使用的文件。但是,如果您真的必须,可以使用ulimit命令增加流程可用的打开文件数量 - see this answer了解详细信息

修改

您可以使用context management确保即使发生错误也会关闭文件:

with h5py.File(file, 'r') as curh5file:
    ... # Do your stuff

... # continue other actions

退出“with”块时,文件将自动关闭。如果发生异常,它仍将被关闭。

答案 1 :(得分:1)

您可能需要在完成这些文件后关闭这些文件,操作系统中有一个限制,您可以一次打开多少个文件。

在您打开h5文件的块的末尾,只需输入一个紧密的声明,一切都应该很好。类似的东西:

curh5file = h5py.File(file, 'r')
...do some stuff
curh5file.close()