python mmap.error:打开的文件过多.怎么了?

Seb*_*ian 4 python linux mmap numpy netcdf

我正在使用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()
Run Code Online (Sandbox Code Playgroud)

错误:

$ 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
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我评论其中一个append命令(要么会做!)它有效!我究竟做错了什么?我正在关闭文件,对吗?这与python列表有某种关系.我使用了不同的,低效的方法之前(总是复制每个元件)的工作.

PS:ulimit -n产生1024,程序在文件号498处失败.

可能与之相关,但解决方案对我不起作用:NumPy和memmap:[Errno 24]打开的文件过多

小智 6

我的猜测是pupynere中的mmap.mmap调用是打开文件描述符(或创建一个新文件描述符).如果你这样做怎么办:

vals.append(curData.variables['O3.MIXING.RATIO'][:].copy())
alts.append(curData.variables['ALTITUDE'][:].copy())
Run Code Online (Sandbox Code Playgroud)