簡體   English   中英

Python Popen.communicate()內存限制的替代方案?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM