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

War es hilfreich?

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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top