为啥python线程会消耗这么多内存?

Posted

技术标签:

【中文标题】为啥python线程会消耗这么多内存?【英文标题】:Why does python thread consume so much memory?为什么python线程会消耗这么多内存? 【发布时间】:2011-04-12 14:14:51 【问题描述】:

为什么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% 运行一个全新的独立进程!

这不就是错了吗?

【问题讨论】:

除非您告诉我们您正在尝试做什么以及如何做,否则任何人都无法回答这个问题。代码?使用示例?输入数据? 见***.com/questions/110259/python-memory-profiler 【参考方案1】:

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

请注意,8MB 只是一块被搁置的地址空间,最初只分配了很少的内存。额外的内存会在需要时提交给堆栈,最高可达 8MB 的限制。

可以使用ulimit -s 调整限制,但在这种情况下,我认为没有理由这样做。

顺便说一句,pmap 显示了地址空间的使用情况。这不是衡量 内存 使用情况的好方法。如果相关的话,这两个概念是完全不同的。

【讨论】:

谢谢,你刚刚救了我的命@Guido 对不起,我会在下一个问题上表扬 python。

以上是关于为啥python线程会消耗这么多内存?的主要内容,如果未能解决你的问题,请参考以下文章

在多线程环境中使用 PyCurl 时程序消耗的内存不断增长

为啥 iOS 设备上的 glGenerateMipmap() 会占用这么多客户端内存?

为啥 R 在使用 read.csv() 时会使用这么多内存?

为啥训练我的朴素贝叶斯分类器会占用这么多内存?

为啥这段代码会消耗这么多堆?

为啥我的 CSS 动画会消耗这么多资源?