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.
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
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