2016-05-16 57 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