首页 > 解决方案 > 为什么嵌套列表会在 Ubuntu 14.04 上泄漏内存?

问题描述

运行时出现“高水位”内存泄漏行为:

import gc
temp = [[0.1] for _ in xrange(10 ** 7)]
del temp
gc.collect()

常驻内存从约 7 MB 开始攀升至约 1000 MB,然后稳定在约 312 MB。后续运行不会增加超过 312 MB 的内存泄漏。为什么会发生这种情况,是否有任何已知的解决方法?

各种观察:

  1. 它发生在 Ubuntu 14.04 上,但不在 OSX 上
  2. 它不会发生在python3中
  3. [[] for _ in xrange(10 ** 7)]不泄漏_
  4. [0.1 for _ in xrange(10 ** 7)]不泄漏_
  5. [(0.1,) for _ in xrange(10 ** 7)]不泄漏_
  6. [0.1 for _ in xrange(10 ** 7)]不泄漏_
  7. {random.random(): {0.1: 0.1} for _ in xrange(10 ** 7)} 确实泄漏
  8. 一次清除单个列表无济于事
  9. 在 python shell 和文件中运行似乎没有影响
  10. 我在 python 版本中重现了该行为:2.7.15、2.7.14、2.7.11 和 2.7.5

我的第一个直觉是,这是由于竞技场没有清理干净造成的。但这没有意义,因为我希望有同样的行为,[0.1 for _ in xrange(10 ** 7)]但那不会发生。

为什么嵌套列表/字典会导致这种高水位线行为?

我主要使用测量常驻内存htop

标签: pythonpython-2.7memory-leaks

解决方案


推荐阅读