python mmap.error:オープンファイルが多すぎます。どうしたの?
質問
私はたくさんのことを読んでいます 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()