Назад | Перейти на главную страницу

Linux Mint: процесс Python получает ошибку «MemoryError» еще до того, как своп станет почти полностью использован

Я пытаюсь запустить скрипт Python, для которого требуется много виртуальной памяти. Я использую 64-разрядную версию Linux Mint 17.3 и Python 2.7.

По мере роста процесса Python я могу видеть (используя команду free -m), как увеличивается объем используемой оперативной памяти, но объем используемого пространства подкачки фактически оказывается равным уменьшение.

Я попытался изменить vm.swappiness с 60 на 90, но, похоже, это не помогло.

Дело не в том, что пространство подкачки полностью не используется - часть его уже используется. Но его не используют так часто, как следовало бы.

Кстати, я нахожусь в экземпляре VMWare.

Как я могу запустить этот большой процесс без ошибки MemoryError и без изменения кода?

Спасибо!

PS: Вот бесплатный вывод -m:

$ while : ; do free -m; date; echo; sleep 10; done
cmd output started 2016 Fri Aug 19 08:47:39 AM PDT
             total       used       free     shared    buffers     cached
Mem:          7968       4764       3203         31        215        335
-/+ buffers/cache:       4214       3754
Swap:         8189       3452       4737
Fri Aug 19 08:47:39 PDT 2016

             total       used       free     shared    buffers     cached
Mem:          7968       4880       3087         31        215        343
-/+ buffers/cache:       4321       3646
Swap:         8189       3451       4738
Fri Aug 19 08:47:49 PDT 2016

             total       used       free     shared    buffers     cached
Mem:          7968       4982       2985         31        215        343
-/+ buffers/cache:       4423       3544
Swap:         8189       3449       4740
Fri Aug 19 08:47:59 PDT 2016

Оказалось, что, хотя процесс начинался медленно, он внезапно увеличился (или попытался вырасти) сильно и попал в состояние нехватки памяти.

Я смог проверить это с помощью strace (Отладка с помощью трассировщиков системных вызовов | stromberg.dnsalias.org). Я мог видеть, как он снова и снова воспроизводит маленькие фрагменты, а затем, прямо перед ошибкой, он воспроизводит большой кусок.

Поэтому я добавил много места для подкачки, и ошибка исчезла.

Спасибо всем, кто это прочитал.