我正在尝试运行一个Python (PySpark应用程序),它占用了太多内存,而我的应用程序因为超出内存限制而被扼杀了(为了能够产生更多的工作人员,我试图降低内存使用率)。
我来自Java/Scala,所以Python的工作方式与我头脑中的JVM类似.
有没有办法告诉Python它有多少“可用内存”?我是说,当你的堆大小几乎满的时候。我想在Python上执行同样的操作,这样that就不会因为当内存是垃圾时使用太多内存而扼杀我的应用程序(我在Python3.3上,内存引用@我的机器)。
我已经看到了资源的硬和软限制,但没有文档说明GCs是否触发了它们。AFAIK通过内存使用触发GC,any1知道怎么做吗?
谢谢,
发布于 2017-08-05 11:45:49
CPython (我假设这是您使用的)与Java有很大的不同。主要的垃圾收集方法是参考计数。除非您处理循环引用(在正常的PySpark工作流中不常见),否则根本不需要完整的GC清理(数据相关对象应该在数据溢出/被腌制后收集)。
星星之火也会杀死闲置的Python工作人员,即使您启用了重用选项,因此它经常完全跳过GC。
可以使用CPython方法控制set_threshold垃圾收集行为:
gc.set_threshold(threshold0[, threshold1[, threshold2]]或者用collect手动触发GC扫描
gc.collect(generation=2)但根据我的经验,PySpark中的大多数GC问题来自于JVM部分,而不是Python。
https://stackoverflow.com/questions/45521402
复制相似问题