web-dev-qa-db-ja.com

pythonプロセス内のメモリ使用量を制限する方法

私はPython 2.7を16GB Ramと64ビットOSを搭載したLinuxマシンで実行します。Apythonスクリプトは、私が書いたスクリプトがメモリにロードしすぎて、マシンを停止して、プロセスを強制終了することさえできないようにします。

呼び出すことでメモリを制限できますが、

ulimit -v 12000000

シェルでスクリプトを実行する前に、スクリプト自体に制限オプションを含めたいと思います。どこを見ても、resourceモジュールはulimitと同じ能力を持っていると言われています。しかし、呼び出す:

import resource
_, hard = resource.getrlimit(resource.RLIMIT_DATA)
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard))

スクリプトの冒頭では、まったく何もしません。 12000という低い値を設定しても、プロセスがクラッシュすることはありません。 RLIMIT_STACKでも同じことを試しましたが、結果も同じでした。不思議なことに、呼び出し:

import subprocess
subprocess.call('ulimit -v 12000', Shell=True)

同様に何もしません。

何が悪いのですか?実際の使用例はオンラインでは見つかりませんでした。


編集:好奇心が強い人にとっては、subprocess.callを使用しても機能しません。これは、現在のpythonプログラムとは独立した)(驚き、驚き!)新しいプロセスを作成するためです。走る。

20
Arne

resource.RLIMIT_VMEM はリソースです ulimit -v に対応します。

RLIMIT_DATAbrk/sbrkシステムコールのみに影響します 一方、 新しいメモリマネージャーはmmapを代わりに使用する傾向があります

2番目に注意する点は、 ulimit / setrlimit は現在のプロセスとその将来の子にのみ影響するということです。

AttributeError: 'module' object has no attribute 'RLIMIT_VMEM'メッセージについて: resource module docs この可能性について言及します。

このモジュールはプラットフォームの違いを隠そうとしません—プラットフォームに定義されていないシンボルは、そのプラットフォームのこのモジュールからは利用できません。

上記にリンクされている bashulimit source によると、RLIMIT_ASが定義されていない場合はRLIMIT_VMEMを使用します。

13
ivan_pozdeev