2016-04-01 15 views
2

Ich benutze Funken Berechnung. alle 5 Minuten bekam ich einen neuen Datenrahmen. Ich habe es in einem dict wie dieser RahmenWie ein Datenframe in Funke freizugeben?

dict_1_hour[timestamp] = dataframe 

Neue Daten genannt dict_1_hour kommt in die dict und alten Datenrahmen aus dem dict herausspringen. Es sind nur 12 Datenfelder gespeichert, das sind die Daten der letzten 1 Stunde.

Also meine Frage ist, wie sollte ich diese Datenrahmen freigeben, um sicherzustellen, dass kein Speicherleck ist?

Eine API für Datenrahmen scheint es tun kann. (Ich weiß nicht, was die Parameter für)

unpersist(blocking=True) 
Marks the DataFrame as non-persistent, and remove all blocks for it from memory and disk. 

Die andere Art, wie ich glaube, nur den Datenrahmen aus dem dict Pop ist.

Python sollte die nicht verwendete Variable automatisch freigeben. Aber ich weiß nicht, ob es hier angebracht ist. Ich machte mir Sorgen, dass Funke die Datenrahmen halten, wenn Sie es nicht explizit

Also bitte Beratung freisetzen, auf dem Weg, ich bitte

+0

Warum denken Sie, es ist ein Speicherleck? Python ist Müll gesammelt und ist in der Regel sehr gut in der Verwaltung von Speicher für Sie. –

+0

Eigentlich gibt es jetzt ein Speicherleck. Das Speicherleck verursacht das Spark Driver-Programm beenden @Akshat Mahajan –

Antwort

2

Vor allem DataFrame, ähnlich wie RDD verwenden sollten, ist nur eine lokale rekursive Datenstruktur. Ich durchlaufe den gleichen Speicherbereinigungszyklus wie jedes andere Objekt, sowohl auf der Python- als auch auf der JVM-Seite.

Der zweite Teil, den Sie beachten müssen, ist persistente Daten (cache, persist, cacheTable, Shuffle-Dateien, etc.). Dies wird im Allgemeinen intern von Spark gehandhabt und außer unpersist haben Sie nicht viel Kontrolle über seine Lebensdauer.

Behalten diese beiden Dinge im Hinterkopf, gibt es nicht viel, was über einfache del auf dem Objekt hinaus getan werden kann.

try: 
    del dict_1_hour[timestamp] 
except KeyError: 
    pass 

Dennoch, wenn DataFrame wurde als temporäre Tabelle registriert wurde, stellen Sie sicher, dass es deregistrieren zuerst:

from py4j.protocol import Py4JError 

try: 
    sqlContext.dropTempTable("df") 
except Py4JError: 
    pass 
+0

Was ist der Unterschied zwischen diesen 3 Möglichkeiten? 1. del dict_1_hour [Zeitstempel] 2. dict_1_hour [Zeitstempel] .unpersist 3. dict_1_hour.pop (Zeitstempel) können wir sagen, dass sie beide die Erinnerung freigegeben haben? (für die Pop-Methode. Ich bin mir sicher, dass es nirgendwo sonst den Datenrahmen gibt, sobald er Pop ist) –

+0

Tatsächlich gibt keiner von diesen wirklich den Speicher frei. Was 'del' oder (' del() '), was nicht durch einfaches' pop' abgedeckt wird, ist '__del__' Methode, die verwendet werden kann, um externe Ressourcen freizugeben (um klar zu sein,' DataFrame' erbt die Standardimplementierung von ' Objekt, so dass dort nichts Interessantes vor sich geht). – zero323

+0

Was ist dann mit Unpersisten? Ich bin Gast, dass, wenn wir nicht cache/persist verwenden, um den Datenrahmen explizit zu halten, dann müssen wir nicht unpersist anrufen, nicht wahr? –

Verwandte Themen