[英]Alternatives to Python Popen.communicate() memory limitations?
我有以下大量的Python代碼(運行v2.7)導致在處理大(幾GB)文件時拋出MemoryError
異常:
myProcess = Popen(myCmd, shell=True, stdout=PIPE, stderr=PIPE)
myStdout, myStderr = myProcess.communicate()
sys.stdout.write(myStdout)
if myStderr:
sys.stderr.write(myStderr)
在閱讀Popen.communicate()
的文檔時 ,似乎有一些緩沖:
注意讀取的數據緩沖在內存中,因此如果數據大小很大或不受限制,請不要使用此方法。
有沒有辦法禁用此緩沖,或強制緩存在進程運行時定期清除?
我應該在Python中使用什么替代方法來運行將數十億字節的數據流式傳輸到stdout
的命令?
我應該注意,我需要處理輸出和錯誤流。
我想我找到了一個解決方案:
myProcess = Popen(myCmd, shell=True, stdout=PIPE, stderr=PIPE)
for ln in myProcess.stdout:
sys.stdout.write(ln)
for ln in myProcess.stderr:
sys.stderr.write(ln)
這似乎讓我的內存使用率下降到足以完成任務。
更新
我最近發現了一種使用線程在Python中處理數據流的更靈活的方法。 有趣的是,Python在shell腳本可以輕松實現的方面非常糟糕!
我可能會做的是,如果我需要讀取stdout以獲取大的東西,則在創建進程時將其發送到文件。
with open(my_large_output_path, 'w') as fo:
with open(my_large_error_path, 'w') as fe:
myProcess = Popen(myCmd, shell=True, stdout=fo, stderr=fe)
編輯:如果需要流式傳輸,可以嘗試制作類似文件的對象並將其傳遞給stdout和stderr。 (盡管如此,我還沒有嘗試過。)然后你可以在寫入時從對象中讀取(查詢)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.