3

RHEL5 を搭載したサーバーで実行される Python スクリプトがあります。サーバーには 32GB のメモリと 2.83GHz の 8 個の Intel Xeon CPU が搭載されています。ハードウェア リソースに問題はないと思いますが、1,500 万行のテキスト ファイルをアップロードして処理しようとすると、次のようなエラー メッセージが表示されます。

Traceback (most recent call last):
  File "./test.py", line 511, in <module>
    startup()
  File "./test.py", line 249, in startup
    cmdoutput = commands.getoutput(cmd_file)
  File "/usr/local/lib/python2.6/commands.py", line 46, in getoutput
    return getstatusoutput(cmd)[1]
  File "/usr/local/lib/python2.6/commands.py", line 55, in getstatusoutput
    pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
OSError: [Errno 12] Cannot allocate memory

この問題を調査しましたが、問題と完全に一致する回答は見つかりませんでした。これらの回答は「popen」サブルーチンに焦点を当てていましたが、私はこのルーチンを使用しません。" " を使用してcommands.getoutput()、ドキュメントのファイルの種類を表示します。

1000 万行のテキストを処理しようとすると、この問題は発生しないことに注意してください。テキストファイルが大きい場合にのみ発生します。この問題について私を助けてくれる人はいますか?答えは、「 」以外のより優れたモジュールである可能性がありますcommand.getoutput()。ありがとう!

4

1 に答える 1

2
  1. コマンドが大量のメモリを消費する可能性があります。確認するには、Python を使用せずにコンソールから大きなファイルを使用して実行し、エラーが発生するかどうかを確認します。
  2. コマンドによって生成される出力が多すぎる可能性があります。確認するには、次を実行します。

    subprocess.check_call(["cmd", "arg1", "arg2"])
    

    成功した場合は、出力を段階的に読み取り、処理された出力を 1 行ずつ破棄する必要があります。

    p = subprocess.Popen(["cmd", "arg1", "arg2"], stdout=subprocess.PIPE)
    for line in iter(p.stdout.readline, ''):
        # do something with line
        print line,
    p.stdout.close()
    exit_code = p.wait() # wait for the process to exit
    
于 2012-08-15T19:28:37.873 に答える