Я экспериментировал с переменными MALLOC_MMAP_THRESHOLD_ и MALLOC_MMAP_MAX_ env, чтобы повлиять на управление памятью в длительном процессе Python 2. См http://man7.org/linux/man-pages/man3/mallopt.3.htmlУменьшить фрагментацию памяти с помощью MALLOC_MMAP_THRESHOLD_ и MALLOC_MMAP_MAX_
Я получил идею от этого сообщения об ошибке: http://bugs.python.org/issue11849
Результатов я обнадеживаю: фрагментация памяти уменьшаются и типичный знак высокой воды, видимый в памяти, используемый долгоиграющими процессы ниже ,
Моя единственная забота - если есть другие побочные эффекты, которые могут укусить назад при использовании таких низкоуровневых настроек. Кто-нибудь имеет опыт использования?
Ниже приведен пример сценария, который показывает, как эти переменные влияют на RSS памяти в сценарии, которые генерируют большой словарь: https://gist.github.com/lbolla/8e2640133032b0a6bb9c Просто запустите «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 используется около 20% меньше, чем ванильным Python для этого примера.
Один из способов обойти это - выполнить работу в раздвоенном процессе, который затем выходит. – o9000
@ o9000 Я не могу этого сделать, потому что этот процесс длится долго. Это сервер, который должен быть там в течение долгого времени. – lbolla
@ Иболла вы можете сделать это даже в случае сервера. Вилка из процесса сервера, операция выделения памяти памяти, возврат из процесса разветвленного процесса в сервер, завершение разветвленного процесса, возврат результата клиенту, который его запросил. Теперь это не всегда означает, что вы решили проблему. Возможно, вход и выход настолько велики, что в любом случае потребуются огромные выделения памяти на сервере. YMMV, но вы можете это сделать. – marr75