2016-05-16 8 views
0

Pythonに問題があり、メモリの問題のデバッグを開始する場所が不明です。回答からの提案を使用して、私はコードの変更を行い、以前にあった行についてコメントしました。Python - memory issue

+2

「ORMClaimReport.py」のコードはどこですか? –

+0

'getORMClaims()'の出力はどうしますか? –

答えて

1

メモリに入りきらないようになるまで、resultsを構築し続けます。

最も簡単で最も直ちに解決できるのは、すべての結果の完全なリストではなく、getORMClaims()をジェネレータにして、一度に1つの結果しか得られないことです。 resultsを取り除き、何かを追加するたびにyield何かがその代わりになる。

あなたの場合、results.append(labels)yield labelsに置き換えます。 results.append(result)yield resultに置き換えてください。

getORMClaims()のメモリ使用の問題を取り除くのは難しくありませんが、リストの代わりに一度に1つの「行」を処理できるように、それを呼び出すものを変更する必要がありますすべての行のループはすでにただ一度に1行を使用しているため

はたとえば、呼び出し元のコードは、

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

その後、あなたは問題ないはずのようになります。それは、より多くのような

reportData = foo.getORMClaims() 

に見える場合しかし、あなたはreportDataを取り除くためにどのように把握する必要があり、ちょうど直接ループにgetORMClaims()の出力を消費します。

あなたがyieldや用語の前発電のことを聞いたことがない場合、これは少し混乱することができ、そしてあなただけの気合いとそれらについて読む必要があります。 1つのリソースは、質問"What does the yield keyword do in Python?"に対してthis comprehensive Stack Overflow answerです。

+0

あなたの答えによると、呼び出しプログラムにはforループがあるので、私がする必要があるのは 'yield 'に置き換えられることだけです。私が間違っていれば私を修正してください。 – user3224907

+0

いいえ、 'for'ループで' getORMClaims() '* *を直接使用する必要があります。あなたのコードは結果を変数に代入します。私の 'reportData = foo.getORMClaims()'の例のように、 'reportData = foo.getORMClaims()'のような呼び出しコードは 'foo'ではなく' reportData'ではなく 'ocs'を持っています。 –

1

resultが大きくなりすぎています。 Pythonはそれに追加するのに十分なメモリを割り当てることができません。

これ以上のことは、ソースコードとあなたが達成しようとしていることの説明なしでは言い表せません。

+0

私はソースコードを追加しました。 – user3224907