Python多线程内存使用:64位与32位的区别

3
我有一个基本的Python程序,它创建了很多线程(2000),处理一些东西,然后将其写出。
我已经将我的代码缩小到与此类似(使用2k个线程): http://www.ibm.com/developerworks/aix/library/au-threadingpython/ 除了在我的类中我实际上什么都不做(从队列中获取项目,然后调用任务完成)。无论是在这个缩小版本中还是在我执行任务的版本中,内存使用量都是相同的。在32位Python解释器中,我使用大约105兆字节的虚拟内存。在64位中,我使用超过8吉字节。
我正在运行RHEL 6。我还添加了: threading.stack_size(32768) 来减小堆栈大小。我假设Python正在获取一些默认限制以保留内存,但我无法弄清楚该限制是什么。
有什么想法吗?
谢谢!

1
你为什么关注虚拟使用?RSS值是什么? - qdot
我知道这不是“真正”的内存使用,但我想知道为什么。RSS相当低,只有几兆。 - Jon
Python中的列表为项目保留空间,也许这就是问题所在? - unddoch
2个回答

2
如果您使用的是RHEL6操作系统或glibc版本大于2.10(您可以通过rpm -q glibc命令检查),那么这是由于缺少MALLOC_ARENA_MAX参数引起的。
在RHEL 6中,glibc(>=2.10)的malloc函数引入了新的共享内存分配器,允许每个线程都能够分配自己的共享内存。可重用的共享内存区域数目也取决于CPU核数。在64位系统上,这些共享内存区域大小为64MB,一个16核系统的默认共享内存区域数目可能高达128个。因此,在使用多个线程时,会导致虚拟内存(VMS)占用大量空间(尽管RSS的增加可能完全正常)。
可以通过将环境变量MALLOC_ARENA_MAX设置为小数字(如1或4)来解决此问题。

0

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