2016-05-16 7 views
0

Haben Sie ein Problem in Python und nicht sicher, wo Sie ein Speicherproblem zu debuggen beginnen. Unter Verwendung der Vorschläge von Antworten habe ich die Änderungen im Code vorgenommen und die Zeilen kommentiert, die vorher vorhanden waren:Python - Speicherproblem

+2

Wo ist der Code von 'ORMClaimReport.py'? –

+0

Also, was machst du mit der Ausgabe von 'getORMClaims()'? –

Antwort

1

Sie bauen results auf, bis es zu groß ist, um in den Speicher zu passen.

Die einfachste und unmittelbarste Lösung hierfür ist die Umwandlung von getORMClaims() in einen Generator, wobei nacheinander jeweils ein Ergebnis anstelle der vollständig erstellten Liste aller Ergebnisse angezeigt wird. Befreien Sie sich von results, und jedes Mal, wenn Sie etwas daran angehängt hätten, yield das etwas stattdessen.

In Ihrem Fall würden Sie results.append(labels) durch yield labels ersetzen; und ersetzen results.append(result) durch yield result.

So ist es nicht schwer, das Speicherbelegungsproblem in getORMClaims() loszuwerden, aber dann müssen Sie möglicherweise ändern, was auch immer es anruft, so dass es eine "Zeile" zu einer Zeit statt einer Liste behandeln kann von allen Reihen.

Zum Beispiel, wenn der Angerufene-Code sieht so etwas wie

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

dann sollten Sie sich gut, weil die Schleife bereits nur zu einem Zeitpunkt eine Zeile mit. Aber wenn es mehr wie

reportData = foo.getORMClaims() 

sieht dann muss man herausfinden, wie von reportData loszuwerden und verbraucht nur die Ausgabe von getORMClaims() direkt in einer Schleife.

Wenn Sie noch nie zuvor von yield oder dem Begriff Generator gehört haben, dann kann dies ein wenig verwirrend sein, und Sie müssen nur nach unten schnallen und über sie lesen. Eine Ressource ist this comprehensive Stack Overflow answer zu der Frage "What does the yield keyword do in Python?".

+0

Laut Ihrer Antwort, ich glaube, alles, was ich tun muss, ist ersetzen mit "Ausbeute", da das aufrufende Programm eine for-Schleife hat. Bitte korrigieren Sie mich, wenn ich falsch liege. – user3224907

+0

Nein, Sie müssen 'getORMClaims()' * direkt * in der 'for'-Schleife verwenden. Ihr Code weist das Ergebnis einer Variablen zu. Ihr Aufrufcode (entsprechend Ihrer letzten Änderung) sieht aus wie mein 'reportData = foo.getORMClaims()' Beispiel, nur haben Sie 'ocs' anstelle von' reportData' und 'vr' anstelle von' foo'. –

1

Ihre result wird zu groß. Python kann nicht genügend Speicher zum Hinzufügen zuweisen.

Mehr als das ist unmöglich zu sagen, ohne den Quellcode und eine Erklärung dessen, was Sie erreichen möchten.

+0

Ich habe den Quellcode hinzugefügt. – user3224907