为什么Python线程会消耗如此多的内存?

6

为什么Python线程会占用那么多内存?

我测量发现,开启一个线程需要消耗8兆内存,几乎相当于一个全新的Python进程!

操作系统:Ubuntu 10.10

编辑:由于众所周知的原因,我将提供一些不相关的例子,请看下面:

from os import getpid
from time import sleep
from threading import Thread

def nap():
    print 'sleeping child'
    sleep(999999999)

print getpid()
child_thread = Thread(target=nap)
sleep(999999999)

在我的电脑上,运行 pmap pid 命令会得到 9424K 的结果。

现在,让我们启动子线程:

from os import getpid
from time import sleep
from threading import Thread

def nap():
    print 'sleeping child'
    sleep(999999999)

print getpid()
child_thread = Thread(target=nap)
child_thread.start()             # <--- ADDED THIS LINE
sleep(999999999)

现在pmap pid将会给出17620K的结果

因此,额外线程的成本为17620K - 9424K = 8196K

即运行一个全新独立进程的87%!

现在这难道不是错误的吗?


8
除非您给出一些关于您尝试做什么以及如何做的想法,否则任何人都无法回答这个问题。 代码?使用示例?输入数据? - jathanism
1
请参考以下链接,了解有关Python内存分析器的信息:https://dev59.com/RHVD5IYBdhLWcg3wDG_l - user2665694
1个回答

17

这并不是特定于Python的问题,而是与操作系统为每个线程分配的单独堆栈有关。您的操作系统默认的最大堆栈大小恰好为8MB。

请注意,这8MB只是设置了一块地址空间,最初很少的内存被分配给它。在需要时,会向堆栈分配额外的内存,直到达到8MB的限制。

可以使用ulimit -s调整此限制,但在此情况下我看不到理由这样做。

另外,pmap显示的是地址空间使用情况,不是衡量内存使用的好方法。这两个概念是相当不同的,尽管有关联。


2
谢谢,@Guido,你刚刚救了我的命。抱歉责备你,下一个问题我会赞扬Python的。 - Ron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接