我正在使用 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
答案 0 :(得分:6)
我的猜测是pupynere中的mmap.mmap调用是打开文件描述符(或创建一个新文件描述符)。如果你这样做会怎么样:
vals.append(curData.variables['O3.MIXING.RATIO'][:].copy())
alts.append(curData.variables['ALTITUDE'][:].copy())
答案 1 :(得分:3)
@corlettk:是的因为它是linux,所以strace -e trace=file
会做
strace -e trace=file,desc,munmap python2.7 /mnt/grid/src/profile/contra.py
这将准确显示何时打开哪个文件 - 甚至是文件描述符。
您也可以使用
ulimit -a
查看当前有效的限制
gdb --args python2.7 /mnt/grid/src/profile/contra.py
(gdb) break dup
(gdb) run
如果在与映射文件相关的断点之前导致断点太多,您可能希望在没有断点的情况下运行它一段时间,手动中断(Ctrl + C)并在“正常”操作期间设置断点;也就是说,如果你有足够的时间:)
一旦中断,请使用
检查调用堆栈(gdb) bt
答案 2 :(得分:2)
嗯...也许,只是也许,with curData
可能会修复它?只是 WILD 猜测。
编辑: curData
是否有Flush
方法?你有没有试过在Close
之前调用它?
编辑2:
Python 2.5的with
语句(直接从Understanding Python's "with" statement解除)
with open("x.txt") as f:
data = f.read()
do something with data
...基本上它一直关闭资源(很像C#的using
构造)。
答案 3 :(得分:1)
nc()
电话的费用是多少?如果在每个文件上运行两次“足够便宜”,这有用吗?
for infile in glob.glob(os.path.join(path, filter)):
curData = nc(infile,'r')
vals.append(curData.variables['O3.MIXING.RATIO'][:])
curData.close()
curData = nc(infile,'r')
alts.append(curData.variables['ALTITUDE'][:])
curData.close()