您可能只是点击了Linux内存分配器的默认行为。
基本上,Linux有两种分配策略:sbrk()用于较小的内存块,mmap()用于较大的内存块。分配给sbrk()的内存块不容易返回到系统,而基于mmap()的内存块可以(只是取消映射页面)。
因此,如果分配的内存块大于libc中malloc()分配器决定在sbrk()和mmap()之间切换的值,则会看到这种效果。请参阅mallopt()调用,尤其是MMAP_THRESHOLD(http://man7.org/linux/man-
pages/man3/mallopt.3.html)。
更新 要回答您的另一个问题:是的,如果内存分配器的工作方式类似于Linux上的libc,则希望以这种方式泄漏内存。如果改用Windows
LowFragmentationHeap,则可能不会泄漏,这与在AIX上类似,具体取决于配置的malloc。也许其他分配器之一(tcmalloc等)也解决了此类问题。sbrk()速度非常快,但是存在内存碎片问题。CPython不能做很多事情,因为它没有紧凑的垃圾收集器,但是引用计数很简单。
Python提供了一些减少缓冲区分配的方法,例如,请参见此处的博客文章:http :
//eli.thegreenplace.net/2011/11/28/less-copies-in-python-with-the-buffer-
protocol和内存视图/
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)