9

Pythonで実行時にオブジェクトのサイズを尋ねる同様の質問がたくさん見つかりました。一部の回答では、サブプロセスのメモリ量に制限を設定することを提案しています。サブプロセスのメモリに制限を設定したくありません。これが私が欲しいものです -

subprocess.Popen()外部プログラムの実行に使用しています。プロセスが完了した後でprocess.stdout.readlines()も、標準出力とエラーを取得できます。process.stderr.readlines()

間違ったプログラムが無限ループに入り、出力を生成し続けると、問題が発生します。出力データをメモリに保存するためsubprocess.Popen()、この無限ループはすぐにメモリ全体を使い果たし、プログラムの速度が低下します。

1 つの解決策は、タイムアウトを指定してコマンドを実行できることです。しかし、プログラムが完了するまでにかかる時間はさまざまです。時間がかかり、無限ループを持つプログラムの場合、大きなタイムアウトは、それを持つ目的を無効にします。

コマンドが生成できるデータ量の上限を 200MB に設定できる簡単な方法はありますか? 制限を超えた場合、コマンドは強制終了されます。

4

2 に答える 2

4

最初:subprocess.Popen()データを保存していませんが、「私たち」と「私たち」のサブプロセスの間のパイプです。

この場合、データを無期限にバッファリングし、最後にのみリストとして返すため、使用readlines()しないでください (この場合、実際にデータを格納するのはこの関数です)。

あなたが何かをするなら

bytes = lines = 0
for line in process.stdout:
    bytes += len(line)
    lines += 1
    if bytes > 200000000 or lines > 10000:
        # handle the described situation
        break

あなたはあなたの質問で望むように振る舞うことができます。ただし、それ以上のデータの生成を停止するために、後でサブプロセスを強制終了することを忘れないでください。

しかし、あなたも世話をしたい場合は、の動作をetc でstderr複製して、適切に行動する必要があります。process.communicate()select()

于 2013-05-02T07:35:33.907 に答える
1

あなたが望むものへの簡単な答えはないようです

http://linux.about.com/library/cmd/blcmdl2_setrlimit.htm

rlimit には、メモリ、CPU、または開いているファイルの数を制限するフラグがありますが、明らかに I/O の量を制限するものは何もありません。

すでに説明したように、手動でケースを処理する必要があります。

于 2013-05-02T07:36:56.587 に答える