65

サブプロセスを使用して別のプログラムを呼び出し、その戻り値を変数に保存しています。このプロセスはループで繰り返され、数千回の繰り返しの後、プログラムは次のエラーでクラッシュしました。

Traceback (most recent call last):
  File "./extract_pcgls.py", line 96, in <module>
    SelfE.append( CalSelfEnergy(i) )
  File "./extract_pcgls.py", line 59, in CalSelfEnergy
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
  File "/usr/lib/python3.2/subprocess.py", line 745, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.2/subprocess.py", line 1166, in _execute_child
    errpipe_read, errpipe_write = _create_pipe()
OSError: [Errno 24] Too many open files

この問題を解決する方法を教えてください。

コメントから提供されるコード:

cmd = "enerCHARMM.pl -parram=x,xtop=topology_modified.rtf,xpar=lipid27_modified.par,nobuildall -out vdwaals {0}".format(cmtup[1])
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
out, err = p.communicate()
4

9 に答える 9

56

Mac OSX (El Capitan) の場合 現在の構成を参照してください:

#ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 256
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

開いているファイルの値を 10K に設定します。

#ulimit -Sn 10000

結果を確認します。

#ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 10000
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited
于 2016-02-06T02:42:32.613 に答える
15

You can try raising the open file limit of the OS:

ulimit -n 2048

于 2013-05-13T17:27:55.857 に答える
9

他の人が指摘しているように、 /etc/security/limits.conf の制限を引き上げ、ファイル記述子も個人的に問題だったので、そうしました

sudo sysctl -w fs.file-max=100000 

そして /etc/sysctl.conf に以下を追加:

fs.file-max = 100000

次の方法でリロードします。

sudo sysctl -p

また、プロセスが他のもの(私のもの)の影響を受けないようにしたい場合は、使用します

cat /proc/{process id}/limits 

あなたのプロセスの実際の制限が何であるかを知るために、私にとっては、Pythonスクリプトを実行しているソフトウェアにも制限が適用され、システム全体の設定が上書きされました.

このエラーに関する私の特定の問題を解決した後、この回答をここに投稿してください。

于 2016-10-26T19:32:16.433 に答える
6

によって作成された子プロセスは、Popen()開いているファイル記述子 (有限のリソース) を親から継承する場合があります。close_fds=Trueそれを避けるために、POSIX (Python 3.2 以降のデフォルト) で使用します。また、「PEP 0446 -- Make new created file descriptors non-inheritable」では、残っているいくつかの問題を扱っています (Python 3.4 以降)

于 2016-02-13T13:20:36.927 に答える