我有大约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])
非常感谢任何帮助/建议/见解:)
答案 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()