python - Spark+Python设置GC内存阈值

标签 python apache-spark memory garbage-collection

我正在尝试运行一个使用过多内存的Python工作程序(PySpark应用程序),并且由于超出内存限制,我的应用程序正在杀死我的YARN(我正在尝试降低内存使用量,以便能够产生更多 worker )。

我来自 Java/Scala,所以在我看来 Python GC 的工作方式与 JVM 类似...

有没有办法告诉Python它有多少“可用内存”?我的意思是,当堆大小几乎已满时,Java GC 会发生。我想在 Python 上执行相同的操作,因此当内存是垃圾时,yarn 不会因为使用太多内存而终止我的应用程序(我使用的是 Python3.3,并且在我的机器上有内存引用)。

我已经看到了资源硬限制和软限制,但没有文档说明 GC 是否会触发它们。 AFAIK 没有任何东西会通过内存使用触发 GC,有没有人知道这样做的方法?

谢谢

最佳答案

CPython(我假设这是您使用的)与 Java 相比有显着不同。主要的垃圾收集方式是reference counting 。除非您处理循环引用(恕我直言,这在正常的 PySpark 工作流程中并不常见),否则您根本不需要完整的 GC 扫描(一旦数据溢出/腌制,就应该收集与数据相关的对象)。

众所周知,Spark 也会杀死空闲的 Python 工作线程,即使您启用了重用选项,因此它通常会完全跳过 GC。

您可以使用 set_threshold 控制 CPython 垃圾收集行为方法:

gc.set_threshold(threshold0[, threshold1[, threshold2]]

或使用 collect 手动触发 GC 扫描:

gc.collect(generation=2)

但根据我的经验,PySpark 中的大多数 GC 问题都来自 JVM 部分,而不是 Python。

关于python - Spark+Python设置GC内存阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45521402/

相关文章:

python - 扩展第一个容器以输出额外的 div 属性

python - 使用 pandas read_csv 和证书

apache-spark - Spark 分别处理多个文件

database - 我应该提交作业以激发 Spark ,还是可以从客户端库运行它们?

c++ - 如果不使用 delete,是否会在函数结束时释放内存?

python scipy eigs : return eigenvector after maximum number of iterations whatever the convergence tolerance

python - 数据框中非数字和零值单元格的索引

database - Spark 1.3 中如何在 Hive 中指示 SparkSQL 中的数据库

excel - 如何清除内存以防止excel vba中的 "out of memory error"?

Git 克隆因内存不足错误而失败 - "fatal: out of memory, malloc failed (tried to allocate 905574791 bytes)/fatal: index-pack failed"