【发布时间】:2011-08-15 09:10:33
【问题描述】:
我正在使用 pupynere 接口 (linux) 读取一堆 netcdf 文件。以下代码导致 mmap 错误:
import numpy as np
import os, glob
from pupynere import NetCDFFile as nc
alts = []
vals = []
path='coll_mip'
filter='*.nc'
for infile in glob.glob(os.path.join(path, filter)):
curData = nc(infile,'r')
vals.append(curData.variables['O3.MIXING.RATIO'][:])
alts.append(curData.variables['ALTITUDE'][:])
curData.close()
错误:
$ python2.7 /mnt/grid/src/profile/contra.py
Traceback (most recent call last):
File "/mnt/grid/src/profile/contra.py", line 15, in <module>
File "/usr/lib/python2.7/site-packages/pupynere-1.0.13-py2.7.egg/pupynere.py", line 159, in __init__
File "/usr/lib/python2.7/site-packages/pupynere-1.0.13-py2.7.egg/pupynere.py", line 386, in _read
File "/usr/lib/python2.7/site-packages/pupynere-1.0.13-py2.7.egg/pupynere.py", line 446, in _read_var_array
mmap.error: [Errno 24] Too many open files
有趣的是,如果我评论其中一个 append 命令(任何一个都可以!)它有效!我究竟做错了什么?我正在关闭文件,对吧?这在某种程度上与 python 列表有关。我使用了另一种效率低下的方法before(总是复制每个元素)。
PS:ulimit -n 产生 1024,程序在文件号 498 处失败。
可能与,但解决方案对我不起作用:NumPy and memmap: [Errno 24] Too many open files
【问题讨论】:
-
Python(如 perl)有一个“调试模式”,你可以用它来“看看库内部发生了什么”?试试看。它可能会有所帮助。您是否还可以在循环中调试打印打开文件句柄的数量(不知何故-;)...我猜它每次迭代都会打开两个文件句柄,仅基于 498(略小于 1024 的一半,并且 Python 会自己打开一些文件(可能是 25 多个?)。
-
感谢您的有用评论。
python2.7 -d没有提供更多信息(我猜在 python 的编译过程中没有启用调试)。跟踪打开文件的数量确实很有趣。我是怎么做到的? -
查看 Sehe 的“答案”...他告诉我们如何在 linux 上跟踪打开的文件句柄 ;-)
标签: python linux numpy mmap netcdf