Stu*_*acy 2 python memory pypy
我注意到在PyPy和Python下运行的程序的内存使用有些奇怪.在PyPy下,该程序不仅使用比CPython大得多的初始内存量,而且这种内存使用量也会随着时间的推移而显着增加.在PyPy下的程序结束时,它使用大约170MB,而在CPython下运行则为14MB.
我找到了一个具有完全相同问题的用户,尽管规模较小,但是对他有用的解决方案只为我的程序提供了一点帮助pypy内存使用量会永远增长吗? 我尝试更改的两件事是将环境变量PYPY_GC_MAX设置为100MB,将PYPY_GC_GROWTH设置为1.1,并在每一代手动调用gc.collect().
我正在确定内存使用情况
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1000
Run Code Online (Sandbox Code Playgroud)
这是不同条件下的运行时和内存使用情况:
Version: time taken, memory used at end of run
PyPy 2.5.0: 100s, 173MB
PyPy with PYPY_GC_MAX = 100MB and PYPY_GC_GROWTH = 1.1: 102s, 178MB
PyPy with gc.collect(): 108s, 131MB
Python 2.7.3: 167s, 14MB
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,程序在PyPy下比CPython快得多,这就是为什么我首先转向它,但代价是内存增加了10倍.
该程序是遗传编程的一个实现,我正在发展一个超过100代的算术二叉树,人口中有200个人.树中的每个节点都有对其2个孩子的引用,这些树的大小可以增加,尽管在这个实验中它们保持相对稳定.根据应用程序,该程序可以运行10分钟到几个小时,但是对于结果,我将其设置为较小的数据集以突出显示该问题.
有没有人有任何想法a)可能导致这种情况的原因,以及b)是否可以将内存使用限制在更可敬的水平?
已知PyPy比CPython使用更多的基线内存,并且随着时间的推移,这个数字会随着JIT编译越来越多的机器代码而增加.它确实(或者至少应该)收敛 - 这意味着内存使用量应该随着程序的运行而增加,但只能达到最大值.运行10分钟或几小时后,您应该得到大致相同的用法.
我们可以无休止地讨论170MB是否过多或不符合"基线".我能说的是,在CPython上使用几GB内存的程序在PyPy上的使用并不多 - 这是我们的目标和迄今为止的经验; 但如果您的经历不同,请将其报告为错误.