PyPy内存使用量随时间增加

时间:2015-03-12 01:08:35

标签: python memory pypy

我注意到在PyPy和Python下运行的程序的内存使用有些奇怪。在PyPy下,该程序不仅使用比CPython大得多的初始内存量,而且这种内存使用量也会随着时间的推移而显着增加。在PyPy下的程序结束时,它使用大约170MB,而在CPython下运行则为14MB。

我发现一个用户遇到完全相同的问题,虽然规模较小,但是对他有用的解决方案只为我的程序提供了一些小帮助pypy memory usage grows forever? 我尝试更改的两件事是将环境变量PYPY_GC_MAX设置为100MB,将PYPY_GC_GROWTH设置为1.1,并在每一代手动调用gc.collect()。

我正在用

确定内存使用情况
resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1000

这是不同条件下的运行时和内存使用情况:

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

正如你所看到的,程序在PyPy下比CPython快得多,这就是为什么我首先转向它,但代价是内存增加了10倍。

该计划是遗传编程的一个实现,我正在发展一个超过100代的算术二叉树,人口中有200个人。树中的每个节点都有对其2个孩子的引用,这些树的大小可以增加,尽管在这个实验中它们保持相对稳定。根据应用程序,该程序可以运行10分钟到几个小时,但是对于结果,我将其设置为较小的数据集以突出显示该问题。

有没有人有任何想法a)可能导致这种情况的原因,以及b)是否可以将内存使用限制在更加可观的水平?

1 个答案:

答案 0 :(得分:8)

已知PyPy比CPython使用更多的基线内存,并且随着时间的推移,这个数字会随着JIT编译越来越多的机器代码而增加。它确实(或者至少应该)收敛 - 这意味着内存使用量应该随着程序的运行而增加,但只能达到最大值。运行10分钟后或几小时后,您应该得到大致相同的用法。

我们可以无休止地讨论170MB是否太多或不适用于#34;基线"。我能说的是,在CPython上使用几GB内存的程序在PyPy上的使用并不多 - 这是我们的目标和迄今为止的经验;但如果您的经历不同,请将其报告为错误。