【问题标题】:Python: Memory leak?Python:内存泄漏?
【发布时间】:2012-12-02 16:01:32
【问题描述】:

在 Python 解释器中查询:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> k = [i for i in xrange(9999999)]
>>> import sys
>>> sys.getsizeof(k)/1024/1024
38
>>>

在这里 - 看看它需要多少 RAM:


语句del k后的内存使用:

gc.collect()之后:

为什么预期大小为 38Mb 的整数列表占用 160Mb?

UPD: 这部分问题得到了回答(几乎是立即和多次:))

好的 - 这是另一个谜:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys

>>> str = 'abcdefg'
>>> sys.getsizeof(str)
28
>>> k = []
>>> for i in xrange(9999999):
...     k.append(str)
...
>>> sys.getsizeof(str)*9999999/1024/1024
267

你认为它现在会消耗多少?


(来源:i.imm.io

str 的大小为 28,而在过去的示例中为 12。因此,预期的内存使用量为 267Mb - 甚至比整数还要多。但它只需要 ~40Mb!

【问题讨论】:

  • 附带说明,如果您正在处理大型数值数组,并且内存(我猜是性能?)是一个问题,那么可能值得考虑使用 NumPy。
  • 好问题。我认为getsizeof() 只计算列表中指针的大小,但实际的整数值在 C 中存储为PyIntObject 结构,每个结构都像任何其他 Python 对象一样有一堆开销。我希望对 Python 内部有更多了解的人(或者现在有更多时间研究它们)可以发布更精确的具体回复作为答案。 :)
  • 您的第二个示例完全无效。您将一个对同一字符串的引用多次存储到数组中。字符串本身只占用一次空间 - 它始终是同一个对象。

标签: python performance optimization memory-leaks


【解决方案1】:

sys.getsizeof() 不是很有用,因为它通常只占您期望的一部分。在这种情况下,它考虑了列表,但不是列表中的所有整数对象。该列表每项大约占用 4 个字节。整数对象每个占用另外 12 个字节。例如,如果您尝试这样做:

k = [42] * 9999999
print sys.getsizeof(k)

您会看到该列表仍然每个项目占用 4 个字节,即大约 40MB,但因为所有项目都是指向同一个整数对象 42 的指针,所以总内存使用量不会超过 40MB。

【讨论】:

  • 领先 11 秒。好答案+1
  • 确实 - 38Mb = 所有指向整数的指针的总和,并且 12(Int 的大小) * 9999999 = 114Mb = 列表中所有实际整数的大小。 38 + 114 = 152Mb。
【解决方案2】:

什么是getsizeof()

首先我建议看一下 size-of 运算符的含义。您可以在documentation 中找到确切的描述。我想放大以下句子。

只考虑直接归因于对象的内存消耗,而不考虑它所引用的对象的内存消耗。

这意味着当您询问 sys.getsizeof([a]) 时,您不会得到数组的实际大小。您只能获得专用于管理列表的所有内存的大小。该列表仍然包含 9999999 个整数。每个整数由 12 个字节组成,总共 114 MB。专用于管理数组的内存总和 32MB 加上数组中数据的内存总和为 146 Mb,这更接近您的结果。

【讨论】:

    猜你喜欢
    • 2011-12-13
    • 2014-02-26
    • 2010-11-27
    • 2015-02-15
    • 1970-01-01
    • 2021-12-04
    • 2021-01-10
    • 2017-10-18
    • 2010-11-23
    相关资源
    最近更新 更多