5

pupynereインターフェース(Linux)を使用して大量のnetcdfファイルを読んでいます。次のコードは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()

エラー:

$ 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

興味深いことに、コマンドの1つにコメントをappend付けると(どちらでもかまいません!)、機能します。私は何が間違っているのですか?ファイルを閉じますよね?これはどういうわけかPythonリストに関連しています。以前は(常に各要素をコピーして)、別の非効率的なアプローチを使用していました。

PS:ulimit -n1024を生成し、プログラムはファイル番号498で失敗します。

に関連しているかもしれませんが、解決策が機能しません:NumPyとmemmap:[Errno24]開いているファイルが多すぎます

4

4 に答える 4

6

私の推測では、pupynereのmmap.mmap呼び出しは、ファイル記述子を開いたままにしている(または新しい記述子を作成している)と思います。これを行うとどうなりますか:

vals.append(curData.variables['O3.MIXING.RATIO'][:].copy())
alts.append(curData.variables['ALTITUDE'][:].copy())
于 2011-04-29T11:33:00.287 に答える
3

@corlettk:ええ、それはLinuxなので、やるstrace -e trace=fileでしょう

strace -e trace=file,desc,munmap python2.7 /mnt/grid/src/profile/contra.py

これにより、いつ開かれるファイルが正確に表示され、ファイル記述子も表示されます。

使用することもできます

ulimit -a

現在有効な制限を確認するには

編集

gdb --args python2.7 /mnt/grid/src/profile/contra.py
(gdb) break dup
(gdb) run

マップされたファイルに関連するブレークポイントよりも前にブレークポイントが多すぎる場合は、ブレークポイントなしでしばらく実行し、手動でブレークして(Ctrl + C)、「通常の」操作中にブレークポイントを設定することをお勧めします。つまり、そのための十分な時間があれば:)

壊れたら、コールスタックを次のように調べます

(gdb) bt
于 2011-04-29T09:53:42.653 に答える
2

Hmmm... Maybe, just maybe, with curData might fix it? Just a WILD guess.


EDIT: Does curData have a Flush method, perchance? Have you tried calling that before Close?


EDIT 2: Python 2.5's with statement (lifted straight from Understanding Python's "with" statement)

with open("x.txt") as f:
    data = f.read()
    do something with data

... basically it ALLWAYS closes the resource (much like C#'s using construct).

于 2011-04-29T09:59:38.297 に答える
1

nc()通話料金はいくらですか?すべてのファイルで2回実行するのに「十分安い」場合、これは機能しますか?

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()
于 2011-04-29T09:53:40.587 に答える