Speicherlimit mit appengine-mapreduce

8

Ich arbeite an der appengine-mapreduce-Funktion und habe die Demo für meinen Zweck modifiziert. Grundsätzlich habe ich eine Million Zeilen im folgenden Format: userid, time1, time2. Mein Zweck ist es, den Unterschied zwischen time1 und time2 für jede Benutzer-ID zu finden.

Als ich dies jedoch in Google App Engine ausführte, bin ich im Abschnitt logs auf diese Fehlermeldung gestoßen:

Überschreitet das Limit für private private Speicher mit 180,56 MB, nachdem insgesamt 130 Anfragen bearbeitet wurden Während der Verarbeitung dieser Anforderung wurde festgestellt, dass der Prozess, der diese Anforderung bearbeitet hat, zu viel Arbeitsspeicher verwendet und beendet wurde. Dies kann dazu führen, dass ein neuer Prozess für die nächste Anfrage an Ihre Anwendung verwendet wird. Wenn diese Meldung häufig angezeigt wird, liegt möglicherweise ein Speicherleck in Ihrer Anwendung vor.

%Vor%

Kann jemand vorschlagen, wie ich meinen Code noch besser optimieren kann? Danke !!

Bearbeitet:

Hier ist der Pipeline-Handler:

%Vor%

Mapreduce.yaml:

%Vor%

Der Rest der Dateien entspricht genau der Demo.

Ich habe eine Kopie meiner Codes auf die Dropbox hochgeladen: Ссылка

    
autumngard 12.02.2012, 17:40
quelle

2 Antworten

2

Es ist wahrscheinlich, dass Ihre Eingabedatei die Grenze für den weichen Speicher überschreitet. Für große Dateien verwenden Sie entweder BlobstoreLineInputReader oder BlobstoreZipLineInputReader .

Diese Eingabe-Lesegeräte übergeben etwas anderes als die Funktion map , sie übergeben das start_position in der Datei und der Textzeile.

Ihre map -Funktion könnte etwa so aussehen:

%Vor%

Wenn Sie BlobstoreLineInputReader verwenden, kann der Job viel schneller ausgeführt werden, da mehr als ein Shard verwendet werden kann (bis zu 256). Dies bedeutet jedoch, dass Sie Ihre Dateien unkomprimiert hochladen müssen, was sehr mühsam sein kann. Ich handle damit, indem ich die komprimierten Dateien auf einen EC2-Windows-Server hochlade und dann dekomprimiere und von dort hochlade, da die Upstream-Bandbreite so groß ist.

    
johnlockwood 13.02.2012, 05:39
quelle
6

Berücksichtigen Sie auch den Aufruf von gc.collect () an regulären Punkten während Ihres Codes. Ich habe mehrere SO-Fragen über das Überschreiten von weichen Speichergrenzen gesehen, die durch Aufrufen von gc.collect () gemildert wurden, wobei die meisten mit Blobstore zu tun haben.

    
Guido van Rossum 15.02.2012 17:50
quelle