Python mmap.Error: Zu viele geöffnete Dateien. Was ist los?
Frage
Ich lese ein paar netcdf Dateien mit dem Puppyne Schnittstelle (Linux). Der folgende Code führt zu einem MMAP -Fehler:
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()
Fehler:
$ 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
Interessant, Wenn ich einen der von kommentiere append
Befehle (entweder wird es tun!) Es klappt! Was mache ich falsch? Ich schließe die Datei, oder? Dies hängt irgendwie mit der Python -Liste zusammen. Ich habe einen anderen, ineffizienten Ansatz verwendet Vor (Immer jedes Element kopieren) Das hat funktioniert.
PS: ulimit -n
Ergibt 1024, das Programm schlägt bei Dateinummer 498 fehl.
Vielleicht im Zusammenhang mit, aber Lösung funktioniert bei mir nicht: Numpy und Memmap: [Errno 24] Zu viele geöffnete Dateien
Lösung
Ich vermute, dass der MMAP.MMAP -Aufruf in Puppyne den Dateideskriptor offen hält (oder ein neues erstellt). Was ist, wenn Sie das tun:
vals.append(curData.variables['O3.MIXING.RATIO'][:].copy())
alts.append(curData.variables['ALTITUDE'][:].copy())
Andere Tipps
@Corlettk: Ja, da es Linux ist, tun Sie es strace -e trace=file
Wird besorgt
strace -e trace=file,desc,munmap python2.7 /mnt/grid/src/profile/contra.py
Dadurch wird genau angezeigt, welche Datei bei - und sogar die Datei -Decriptoren geöffnet ist.
Sie können auch verwenden
ulimit -a
Um zu sehen, welche Einschränkungen derzeit wirksam sind
Bearbeiten
gdb --args python2.7 /mnt/grid/src/profile/contra.py
(gdb) break dup
(gdb) run
Wenn dies zu vielen Haltepunkten vor den mit den zugeordneten Dateien bezogenen Breakpoints führt, möchten Sie sie möglicherweise für eine Weile ohne Breakpoints ausführen, manuell (Strg+C) brechen und den Haltepunkt während des normalen Betriebs einstellen. Das heißt, wenn Sie genug Zeit dafür haben :)
Sobald es bricht, inspizieren Sie den Anrufstapel mit
(gdb) bt
Hmmm ... vielleicht, einfach vielleicht, with curData
Könnte es reparieren? Nur a WILD erraten.
BEARBEITEN: Tut curData
haben eine Flush
Methode, Perchance? Haben Sie versucht, das vorher anzurufen? Close
?
Bearbeiten 2:Python 2.5 with
Aussage (direkt von erhoben von Pythons "mit" Aussage verstehen)
with open("x.txt") as f:
data = f.read()
do something with data
... im Grunde schließt es immer die Ressource (ähnlich wie C#'s using
konstruieren).
Wie teuer ist das nc()
Anruf? Wenn es "billig genug" ist, zweimal in jeder Datei zu laufen, funktioniert das dann?
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()