【问题标题】:PyPy memory usage increasing over timePyPy 内存使用量随时间增加
【发布时间】: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 多。很奇怪。

标签: python memory pypy


【解决方案1】:

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

我们可以无休止地讨论 170MB 对于“基线”是否太多。我可以说的是,在 CPython 上使用几 GB 内存的程序在 PyPy 上使用的内存并没有显着增加——这是我们的目标和迄今为止的经验;但如果您的体验不同,请将其报告为错误。

【讨论】:

  • 我在程序中观察到的问题是,这种内存使用似乎没有收敛。在正常情况下,我在同一进程中连续运行程序 10 次。我刚刚对此进行了测试,PyPy 最后使用了 500MB,而 Python 仍然使用了 14MB。我使用 PyPy 进行科学研究,如果它们使用超过 GB,我运行我的程序的计算机会终止它们,这种情况已经发生了好几次。我可以让程序将 10 个实验作为单独的进程运行,但是 JIT 没有那么长的预热时间。我会更多地使用 GC 选项。
  • 我们(PyPy 团队)随时准备进一步研究此类问题。随时报告,例如到 bugs.pypy.org 或在 irc.freenode.net 上与我们交谈,#pypy。
猜你喜欢
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2018-08-20
相关资源
最近更新 更多