私は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プログラムとは独立した)(驚き、驚き!)新しいプロセスを作成するためです。走る。
resource.RLIMIT_VMEM
はリソースです ulimit -v
に対応します。
RLIMIT_DATA
brk/sbrk
システムコールのみに影響します 一方、 新しいメモリマネージャーはmmap
を代わりに使用する傾向があります 。
2番目に注意する点は、 ulimit
/ setrlimit
は現在のプロセスとその将来の子にのみ影響するということです。
AttributeError: 'module' object has no attribute 'RLIMIT_VMEM'
メッセージについて: resource
module docs この可能性について言及します。
このモジュールはプラットフォームの違いを隠そうとしません—プラットフォームに定義されていないシンボルは、そのプラットフォームのこのモジュールからは利用できません。
上記にリンクされている bash
ulimit
source によると、RLIMIT_AS
が定義されていない場合はRLIMIT_VMEM
を使用します。