2012-08-15 53 views
2

我有一個運行在RHEL5服務器上的Python腳本。該服務器擁有32GB內存和8個Intel Xeon CPU,頻率爲2.83GHz。我認爲,硬件資源不應該是一個問題,但是當我試圖上傳和處理1500萬行的文本文件,該計劃給了我一個錯誤信息:commands.getoutput()引發Errno 12 - 無法分配內存

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()」以外的更好的模塊。謝謝!

+2

嘗試尋找在subprocess.Popen。我不確定,但我認爲你的問題與command.getoutput將嘗試將所有輸出保存在內存中並立即返回有關。避免這種做法。 – user37078 2012-08-15 19:10:35

+0

該命令對文件做了什麼?它是否將它全部讀入內存並執行一些本地操作?它是否輸出一大堆到控制檯,你的腳本會讀取大量的數據? – jdi 2012-08-15 19:13:32

+1

再看一下回溯,你實際上隱式地使用os.popen(getoutput()調用它) – 2012-08-15 19:15:43

回答

2
  1. 您的命令可能會消耗太多內存。要檢查,使用不帶python的控制檯中的大文件運行它,以查看是否有任何錯誤
  2. 您的命令可能會生成太多輸出。檢查,運行:

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

    如果成功,那麼您應該逐步讀取輸出並丟棄處理過的輸出,例如,逐行:

    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 
    
+0

快樂大5-0! :-) – jdi 2012-08-15 23:26:44