如何在spark中释放数据帧?

2024-04-24 10:23:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用斯帕克做一些计算。每5分钟,我就有一个新的数据帧。我把它放进了一个叫做dict的录音机里

dict_1_hour[timestamp] = dataframe

新的数据帧进入dict,旧的数据帧从dict弹出,只有12个数据帧保存在其中,即最近1小时的数据。

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

一个dataframe的API似乎可以做到这一点

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

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

dict_1_hour.pop(timestamp)

Python应该自动释放未使用的变量。但我不知道这是否合适。我担心spark可能会保留数据帧,如果你不显式地释放它

所以请告诉我该用哪种方式


Tags: andthe数据内存apitruedataframeblocking
1条回答
网友
1楼 · 发布于 2024-04-24 10:23:12

首先,与RDD类似的DataFrame只是一个局部递归数据结构。在Python和JVM方面,我与任何其他对象都经历相同的垃圾收集周期。

您必须考虑的第二部分是持久化数据(cachepersistcacheTable、无序文件等)。这通常是由Spark内部处理的,除了unpersist之外,您对它的生命周期没有太多的控制。

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

try:
    del dict_1_hour[timestamp]
except KeyError:
    pass

不过,如果DataFrame已注册为临时表,请确保先注销它:

from py4j.protocol import Py4JError

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

相关问题 更多 >