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:

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

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top