python mmap.error: Trop de fichiers ouverts. Qu'est-ce qui ne va pas?
Question
Je lis un tas de netcdf fichiers en utilisant le pupynere Interface (linux). Les résultats de code suivant dans une erreur 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()
Erreur:
$ 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
Il est intéressant, si je remarque une des commandes de append
(soit le fera!) ça marche! Qu'est-ce que je fais mal? Je ferme le fichier, non? Ceci est lié en quelque sorte à la liste python. J'ai utilisé une approche différente, inefficace avant (toujours copier chaque élément) qui a travaillé.
PS: les rendements ulimit -n
1024, le programme échoue au numéro de dossier 498.
peut-être lié, mais la solution ne fonctionne pas pour moi:
La solution Je suppose que l'appel mmap.mmap en pupynere maintient ouvert de descripteur de fichier (ou en créer un nouveau). Que faire si vous faites ceci: vals.append(curData.variables['O3.MIXING.RATIO'][:].copy())
alts.append(curData.variables['ALTITUDE'][:].copy())
Autres conseils
@corlettk: oui, car il est linux, ne strace -e trace=file
fera
strace -e trace=file,desc,munmap python2.7 /mnt/grid/src/profile/contra.py
Cela montrera exactement quel fichier est ouvert quand -. Et même le fichier decriptors
Vous pouvez également utiliser
ulimit -a
Pour voir quelles sont les limites sont actuellement en vigueur
Modifier
gdb --args python2.7 /mnt/grid/src/profile/contra.py
(gdb) break dup
(gdb) run
Si cela aboutit à un trop grand nombre de points d'arrêt avant ceux liés aux fichiers mis en correspondance, vous pouvez l'exécuter sans points d'arrêt pendant un certain temps, casser manuellement (Ctrl + C) et régler le point d'arrêt pendant le fonctionnement « normal »; qui est, si vous avez assez de temps pour cela:)
Une fois qu'il se casse, inspecter la pile avec appel
(gdb) bt
Hmmm ... Peut-être, juste peut-être, with curData
pourrait résoudre ce problème? Juste un WILD deviner.
EDIT: Est-ce curData
ont une méthode de Flush
, par hasard? Avez-vous essayé d'appeler ça avant Close
?
EDIT 2:
La déclaration de with
de Python 2.5 (droit levé de Comprendre "avec" déclaration de Python )
with open("x.txt") as f:
data = f.read()
do something with data
... Fondamentalement, il ALLWAYS ferme la ressource (un peu comme C # 's construction de using
).
Quel est le coût de l'appel nc()
? Si elle est « assez pas cher » courir deux fois sur chaque fichier, cela fonctionne?
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()