質問

私はたくさんのことを読んでいます netcdf を使用して Pupynere インターフェイス(Linux)。次のコードの結果、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 -n 1024を獲得し、プログラムはファイル番号498で失敗します。

たぶん関連していますが、ソリューションは私にはうまくいきません: numpy and memmap:[errno 24]あまりにも多くのオープンファイル

役に立ちましたか?

解決

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

vals.append(curData.variables['O3.MIXING.RATIO'][:].copy())
alts.append(curData.variables['ALTITUDE'][:].copy())

他のヒント

@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

うーん...多分、たぶん、 with curData それを修正するかもしれませんか?ただ 野生 推測してみて。


編集: します curData 持っている Flush 方法、パルチャンス?前に電話してみましたか Close?


編集2:Python 2.5の with ステートメント(からまっすぐ持ち上げられました Pythonの「With」ステートメントを理解する)

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

...基本的にそれは常にリソースを閉じます(c#のようによく似ています using 構築)。

どれほど高価ですか 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()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top