Python 如何在spark中释放数据帧?

Python 如何在spark中释放数据帧?,python,apache-spark,Python,Apache Spark,我正在用spark做一些计算。每5分钟,我就会得到一个新的数据帧。我把它放进一个叫dict_1_hour的字典里,就像这样 dict_1_hour[timestamp] = dataframe 新数据帧进入dict,旧数据帧从dict弹出。其中仅保留12个数据帧,即最近1小时的数据 所以我的问题是,我应该如何释放这些数据帧以确保没有内存泄漏 dataframe的一个API似乎可以做到这一点。(我不知道参数的用途) 我认为另一种方法是从dict中弹出数据帧 dict_1_hour.pop(tim

我正在用spark做一些计算。每5分钟,我就会得到一个新的数据帧。我把它放进一个叫dict_1_hour的字典里,就像这样

dict_1_hour[timestamp] = dataframe
新数据帧进入dict,旧数据帧从dict弹出。其中仅保留12个数据帧,即最近1小时的数据

所以我的问题是,我应该如何释放这些数据帧以确保没有内存泄漏

dataframe的一个API似乎可以做到这一点。(我不知道参数的用途)

我认为另一种方法是从dict中弹出数据帧

dict_1_hour.pop(timestamp)
Python应该自动释放未使用的变量。但我不知道这是否合适。我担心spark可能会保留数据帧,如果您不明确发布它


因此,请告诉我应该使用哪种方法请首先
DataFrame
,类似于
RDD
,它只是一种局部递归数据结构。在Python和JVM端,我与任何其他对象都经历相同的垃圾收集周期

第二部分必须考虑的是持久化数据(<代码> Cache < /COD>,<代码>持久性<代码>,<代码>可缓存< /代码>,洗牌文件等)。这通常由Spark内部处理,不包括

unpersist
,您对其生命周期没有太多控制权

记住这两件事,除了对对象进行简单的
del
之外,没有什么可以做的

try:
    del dict_1_hour[timestamp]
except KeyError:
    pass
尽管如此,如果已将数据帧注册为临时表,请确保先将其注销:

from py4j.protocol import Py4JError

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

你认为为什么会有内存泄漏?Python是垃圾收集的,通常非常擅长为您管理内存。实际上,现在确实存在内存泄漏。内存泄漏导致火花驱动程序停止@Akshat Mahajan这三种方式之间有什么区别?1.del dict_1_小时[时间戳]2。口述1小时[时间戳].取消持久性3。我们可以说他们都释放了记忆吗?(对于pop方法,我确信一旦数据帧是pop,就不会有其他地方使用它)实际上,这些方法都不会真正释放内存。什么
del
或(
del()
)不在简单的
pop
中,是调用
\uu del\uuu
方法,该方法可用于释放外部资源(很明显
DataFrame
对象继承默认实现,因此没有什么有趣的事情发生).那不持久呢?我想说的是,如果我们没有使用cache/persist来显式地保留数据帧,那么我们就不需要调用unpersist,对吗?你是对的,即使你这样做了,它也应该被自动清除。
from py4j.protocol import Py4JError

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