【发布时间】:2015-03-12 01:08:35
【问题描述】:
我注意到在 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) 是否可以将内存使用限制在更可观的水平?
【问题讨论】:
-
运行
gc.collect增加内存使用量。而且 CPython 使用的内存比 PyPy 多。很奇怪。