2015-11-13 6 views
5

Ich habe einen Workflow auf etwa 3 Millionen Datensätze x 15 Spalten alle Zeichenfolgen auf meinem 4 Kerne 16 GB-Maschine mit Pyspark 1.5 im lokalen Modus ausgeführt. Ich habe festgestellt, dass, wenn ich den gleichen Arbeitsablauf erneut ausführen, ohne zuerst Spark neu zu starten, der Speicher abläuft und ich Out of Memory Exceptions bekomme.Manuell Sparks Garbage Collection von pyspark aufrufen

Da alle meine Caches zusammen etwa 1 GB ergeben, dachte ich, dass das Problem in der Garbage Collection liegt. Ich war in der Lage, den Python-Müllsammler manuell zu starten, indem ich anrief:

import gc 
collected = gc.collect() 
print "Garbage collector: collected %d objects." % collected 

Dies hat ein wenig geholfen.

Ich habe mit den Einstellungen von Funken GC nach diesem article gespielt, und habe versucht, die RDD zu komprimieren und den Serializer zu Kyro zu ändern. Dies hatte die Verarbeitung verlangsamt und half nicht viel mit der Erinnerung.

Da ich genau weiß, wann ich freie CPU-Zyklen habe, um den GC zu rufen, könnte es meiner Situation helfen, zu wissen, wie man es manuell in der JVM aufruft.

Antwort

0

Sie müssen den GC nie manuell aufrufen. Wenn Sie OOMException hatten, liegt das daran, dass kein Speicher mehr verfügbar ist. Sie sollten nach Speicherverlust suchen, auch bekannt als Referenzen, die Sie in Ihrem Code behalten. Wenn Sie diese Referenzen freigeben, stellt die JVM bei Bedarf freien Speicherplatz zur Verfügung.

+0

Ja, ich habe das schon oft gelesen, aber ich denke immer noch, dass mein Fall aus mehreren Gründen für manuelle GC infrage kommt: a. Es war vorteilhaft, den Python-GC aufzurufen, da er die Anzahl der Garbage-Objekte und nicht deren Größe berücksichtigt, b. Die Art meiner Anwendung umfasst Phasen, in denen keine Berechnung stattfindet, während auf eine Benutzerentscheidung gewartet wird, und c. Was ist, wenn ich eine speicherintensive Python-Funktionalität oder eine komplett andere Anwendung ausführen muss? Ich bezweifle, dass die JVM gc für das Konto würde – architectonic

+0

Wenn Sie Memory-intensive Funktionalität auf dem jvm (wenn nicht für Python wissen) ausführen, wird die VM den gesamten Speicher verwenden Sie alle es zu verwenden und wenn es mehr benötigt crash (weil der jvm deinen Wunsch respektiert;). Rufen Sie die GC, wenn es keine Computer gibt, kann als eine gute Idee gesehen werden, aber diese GC wird eine vollständige GC und vollständige GC sind langsam sehr langsam. In jedem Fall, wenn Sie eine Out of Memory Exception auftreten, ist es kein GC-Problem! Es ist ein Codeproblem! Entweder ein Bedarf an mehr Speicher oder ein Speicherleck. – crak