Python 使用MALLOC_MMAP_THRESHOLD_和MALLOC_MMAP_MAX减少内存碎片_

Python 使用MALLOC_MMAP_THRESHOLD_和MALLOC_MMAP_MAX减少内存碎片_,python,malloc,mmap,Python,Malloc,Mmap,我一直在试验MALLOC_MMAP_THRESHOLD_uu和MALLOC_MMAP_MAX_uenv变量,以影响长期运行的Python 2进程中的内存管理。 看 我从这个bug报告中得到了这个想法: 我得到的结果令人鼓舞:内存碎片减少了,长时间运行的进程所使用的内存中可见的典型高水位线也降低了 我唯一担心的是,当使用如此低水平的调整时,是否有其他副作用可能会产生反作用。有人有使用它们的经验吗 下面是一个示例脚本,它显示了这些变量如何影响生成大型字典的脚本中的RSS内存: 只需运行“alloc.

我一直在试验MALLOC_MMAP_THRESHOLD_uu和MALLOC_MMAP_MAX_uenv变量,以影响长期运行的Python 2进程中的内存管理。 看

我从这个bug报告中得到了这个想法:

我得到的结果令人鼓舞:内存碎片减少了,长时间运行的进程所使用的内存中可见的典型高水位线也降低了

我唯一担心的是,当使用如此低水平的调整时,是否有其他副作用可能会产生反作用。有人有使用它们的经验吗

下面是一个示例脚本,它显示了这些变量如何影响生成大型字典的脚本中的RSS内存: 只需运行“alloc.sh”并比较输出。以下是我的输出:

MALLOC_MMAP_THRESHOLD_=None MALLOC_MMAP_MAX_=None
N=9 RSS=120968
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=None
N=9 RSS=157008
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=None
N=9 RSS=98484
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=None
N=9 RSS=98484
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=None
N=9 RSS=98496
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=None
N=9 RSS=98528
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=0
N=9 RSS=121008
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=0
N=9 RSS=121008
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=0
N=9 RSS=121012
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=0
N=9 RSS=121000
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=0
N=9 RSS=121008
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=16777216
N=9 RSS=157004
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=16777216
N=9 RSS=98484
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=16777216
N=9 RSS=98484
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=16777216
N=9 RSS=98496
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=16777216
N=9 RSS=98528

如您所见,本例中使用的RSS比普通Python大约少20%。

使用此调整已经很长时间了,没有任何问题。 因此,在某些情况下,我认为在长时间运行的Python进程中提高内存使用率是一个可行的选择。

我还使用:

MALLOC_MMAP_THRESHOLD_=8192

MALLOC_ARENA_MAX=4

到目前为止,成绩不错

解决这个问题的一种方法是在一个分叉的进程中进行工作,然后退出。@o9000我不能这样做,因为这个进程是长期运行的。这是一个服务器,应该在那里呆很长时间。@Ibolla即使在服务器的情况下,你也可以这样做。从服务器进程分叉,运行内存分配操作,从分叉进程返回到服务器进程,终止分叉进程,将结果返回到请求它的客户端。现在,这并不意味着你已经解决了问题。可能输入和输出太大了,无论如何都需要在服务器上分配大量内存。但是你能做到。