python mmap.error: Troppi file aperti. Cosa c'è che non va?
Domanda
Sto leggendo un po 'di netcdf file utilizzando il pupynere di interfaccia (linux). Il codice seguente genera un errore 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()
Errore:
$ 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
È interessante notare che, se io commento uno dei comandi append
(sia lo farà!) funziona! Che cosa sto facendo di sbagliato? Sto chiudendo il file, giusto? Questo è in qualche modo legato alla lista pitone. Ho usato un diverso, inefficiente approccio prima (copiando sempre ogni elemento) che ha funzionato.
PS: i rendimenti ulimit -n
1024, il programma non riesce a numero di file 498.
forse relativa a, ma soluzione non funziona per me: NumPy e memmap: [Errno 24] Troppi file aperti
Soluzione
La mia ipotesi è che la chiamata in mmap.mmap pupynere sta tenendo aperto descrittore di file (o crearne uno nuovo). Che cosa succede se si esegue questa operazione:
vals.append(curData.variables['O3.MIXING.RATIO'][:].copy())
alts.append(curData.variables['ALTITUDE'][:].copy())
Altri suggerimenti
@corlettk: sì dal momento che è Linux, non strace -e trace=file
farà
strace -e trace=file,desc,munmap python2.7 /mnt/grid/src/profile/contra.py
Questo mostrerà esattamente quale file viene aperto quando -. E anche i decriptors di file
È inoltre possibile utilizzare
ulimit -a
Per vedere quali sono le limitazioni attualmente in vigore
Modifica
gdb --args python2.7 /mnt/grid/src/profile/contra.py
(gdb) break dup
(gdb) run
Se che si traduce in troppi punti di interruzione prima di quelli relativi ai file mappati, si potrebbe desiderare di eseguirlo senza breakpoint per un po ', romperlo manualmente (Ctrl + C) e impostare il punto di interruzione durante il funzionamento 'normale'; cioè, se avete abbastanza tempo per questo:)
Una volta che si rompe, ispezionare la chiamata stack con
(gdb) bt
Hmmm ... Forse, solo forse, with curData
potrebbe risolvere il problema? Solo un SELVAGGIO indovinare.
Modifica non ha un metodo curData
Flush
, per caso? Hai provato a chiamare prima Close
?
EDIT 2:
dichiarazione with
Python 2.5 del (sollevato direttamente dalla Capire Python "con" dichiarazione )
with open("x.txt") as f:
data = f.read()
do something with data
... in fondo si ALLWAYS chiude la risorsa (molto simile a C # 's using
costrutto).
Quanto costa la chiamata nc()
? Se è 'abbastanza a buon mercato' per eseguire due volte su ogni file, fa questo lavoro?
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()