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

È stato utile?

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top