2016-05-16 58 views
0

在Python中遇到問題並且不確定從哪裏開始調試內存問題。使用答案中的建議我已對代碼進行了更改,並評論了以前的代碼行:Python - 內存問題

+2

'ORMClaimReport.py'的代碼在哪裏? –

+0

那麼你如何處理'getORMClaims()'的輸出呢? –

回答

1

你一直在積累results,直到它太大,不適合內存。

最簡單,最直接的解決方法是將getORMClaims()變成一個生成器,一次產生一個結果,而不是所有結果的完整列表。擺脫results,並且每次你將附加的東西給它,yield那東西代替。

在你的情況下,你會用yield labels替換results.append(labels);並用yield result代替results.append(result)

因此,在getORMClaims()內部擺脫內存使用問題並不困難,但是您可能還必須更改所有調用它的內容,以便它可以處理一次接收一個「行」而不是列表的所有行。

例如,如果調用代碼看起來像

for row in foo.getORMClaims(): 
    writer.writerow(row) 

那麼你應該罰款,因爲循環已經只用一行在同一時間。但是,如果它看起來更像

reportData = foo.getORMClaims() 

那麼你必須弄清楚如何擺脫reportData,只是消耗的getORMClaims()的直接輸出在一個循環。

如果你從來沒有聽說過的yield或術語發電機之前,那麼這可能是一個有點混亂,你就只能扣下來,閱讀它們。一個資源是this comprehensive Stack Overflow answer到問題"What does the yield keyword do in Python?"

+0

根據你的回答,我相信我所需要做的就是用'yield'來代替,因爲調用程序有一個for循環。如果我錯了,請糾正我。 – user3224907

+0

不,您必須在'for'循環中直接使用'getORMClaims()'* *。您的代碼將結果分配給一個變量。你的調用代碼(根據你最近的編輯)看起來像我的'reportData = foo.getORMClaims()'例子,只是你有'ocs'而不是'reportData'和'vr'而不是'foo'。 –

1

您的result變得太大了。 Python無法分配足夠的內存來添加它。

如果沒有源代碼和解釋你正在努力完成的事情,這不僅是不可能的。

+0

我已經添加了源代碼。 – user3224907