Warum verliert diese Python-Methode Speicher?

8

Diese Methode iteriert über eine Liste von Begriffen in der Datenbank, prüft, ob die Begriffe in dem Text enthalten sind, der als Argument übergeben wurde, und wenn einer ist, ersetzen Sie ihn durch einen Link zur Suchseite mit dem Begriff als Parameter.

Die Anzahl der Begriffe ist hoch (etwa 100000), daher ist der Prozess ziemlich langsam, aber das ist OK, da es als Cron-Job ausgeführt wird. Es führt jedoch dazu, dass der Skriptspeicherverbrauch in die Höhe schnellen wird und ich den Grund nicht finden kann:

%Vor%

Sie werden diesen Code wahrscheinlich auch wollen:

%Vor%

Ich habe wirklich nur zwei Objekte mit Referenzen, die hier verdächtig sein könnten: terms und processed . Aber ich sehe keinen Grund dafür, dass sie nicht Müll gesammelt werden.

BEARBEITEN:

Ich denke, ich sollte sagen, dass diese Methode innerhalb einer Django-Modellmethode selbst aufgerufen wird. Ich weiß nicht, ob es relevant ist, aber hier ist der Code:

%Vor%

Ich kann mir vorstellen, dass das automatische Python-Regex-Caching etwas Speicher auffrisst. Aber es sollte nur einmal geschehen und der Speicherverbrauch steigt bei jedem Aufruf von update_html_description .

Das Problem ist nicht nur, dass es viel Speicher verbraucht, das Problem ist, dass es es nicht freigibt: Jeder Aufruf nimmt etwa 3% des RAMs in Anspruch, füllt ihn schließlich auf und stürzt das Skript mit 'Speicher nicht zuordnen' ab. .

    
e-satis 18.07.2011, 21:26
quelle

4 Antworten

3

Der gesamte Abfrage-Satz wird in den Speicher geladen, sobald Sie ihn aufrufen, was Ihren Speicher auffressen wird. Wenn die Ergebnismenge so groß ist, möchten Sie Teile der Ergebnisse erhalten, es könnten mehr Treffer in der Datenbank sein, aber das bedeutet viel weniger Speicherverbrauch.

    
Giltech 18.07.2011 21:33
quelle
1

stellen Sie sicher, dass Sie nicht in DEBUG ausgeführt werden.

    
Skylar Saveland 18.07.2011 22:13
quelle
1

Ich war vollständig nicht in der Lage, die Ursache des Problems zu finden, aber im Moment bin ich dabei, indem ich das berüchtigte Snippet isoliert, indem ich ein Skript (mit subprocess ) aufruft, das diesen Methodenaufruf enthält. Der Speicher steigt aber natürlich, geht nach dem Python-Prozess wieder normal.

Sprechen Sie über schmutzig.

Aber das ist alles, was ich für jetzt habe.

    
e-satis 18.07.2011 23:47
quelle
-1
  

Ich denke, ich sollte sagen, dass diese Methode innerhalb einer Django-Modellmethode selbst aufgerufen wird.

     

@classmethod

Warum? Warum ist diese "Klassenstufe"

?

Warum sind das nicht gewöhnliche Methoden, die normale Bereichsregeln haben können und - im normalen Ablauf - Müll sammeln?

Mit anderen Worten (in Form einer Antwort)

Befreie @classmethod .

    
S.Lott 18.07.2011 22:14
quelle

Tags und Links