Вопрос по python – использование памяти, как освободить память

2

Я использую python, и при индексации документов (для поисковой системы) требуется много оперативной памяти, после того как я остановил процесс индексации, память все еще заполнена (например, 8 ГБ ОЗУ). Это плохо, потому что мне нужно, чтобы моя поисковая система работала все время, а не перезагружала ОС после завершения индексации. Есть ли какой-нибудь эффективный способ как управлять огромными массивами, словарями и списками, и как их освобождать. Есть идеи?

Я видел также несколько вопросов об этом на stackoverflow, но они старые:

Объем памяти Python по сравнению с размером кучи

Распределение памяти профиля в Python (с поддержкой массивов Numpy)

Информация:

free -t
             total       used       free     shared    buffers     cached
Mem:          5839       5724        114          0         15       1011
-/+ buffers/cache:       4698       1141
Swap:         1021        186        835
Total:        6861       5910        950


top | grep python 

 3164 root      20   0 68748  31m 1404 R   17  0.5  53:43.89 python                                                                     
 6716 baddc0re  20   0 84788  30m 1692 S    0  0.5   0:06.81 python     

 ps aux | grep python

root      3164 57.1  0.4  64876 29824 pts/0    R+   May27  54:23 python SE_doc_parse.py
baddc0re  6693  0.0  0.2  53240 16224 pts/1    S+   00:46   0:00 python index.py

uptime

01:02:40 up  1:43,  3 users,  load average: 1.22, 1.46, 1.39


sysctl vm.min_free_kbytes

vm.min_free_kbytes = 67584

Реальная проблема в том, что когда я запускаю скрипт, индексация происходит быстро, но когда использование увеличивается, оно становится медленнее.

Document wikidoc_18784 added on 2012-05-28 01:03:46 "fast"
wikidoc_18784
-----------------------------------
Document wikidoc_21934 added on 2012-05-28 01:04:00 "slower"
wikidoc_21934
-----------------------------------
Document wikidoc_22903 added on 2012-05-28 01:04:01 "slower"
wikidoc_22903
-----------------------------------
Document wikidoc_20274 added on 2012-05-28 01:04:10 "slower"
wikidoc_20274
-----------------------------------
Document wikidoc_23013 added on 2012-05-28 01:04:53  "even more slower"
wikidoc_23013

Размер документов - максимум одна или две страницы текста. Индексация 10 страниц занимает около 2-3 секунд.

Tnx всем за помощь :)

Хорошо, когда система работает медленно, каков выводfree? И каков выходuptime? David Schwartz
Ну все медленно. Производительность поисковой системы снижается. badc0re
Вы забыли сказать, в чем проблема. Что произойдет, если вы не перезагрузите ОС? Что-то падает? Или бегать медленно? Или что? David Schwartz
Я написал & quot; индексирование документов (для поисковой системы) & quot; и я сказал, что вся система работает медленно. Linux Ubuntu 11.10 является ОС. badc0re
Вам нужно описать проблему тогда. Никто, читающий ваш вопрос, не сможет понять, что это проблема производительности поисковой системы. Что остается медленным после завершения индексации? Просто Python или система в целом? И является ли ЦП в основном бездействующим, пока он медленный? Какая ОС? Как выглядит статистика системной памяти? David Schwartz

Ваш Ответ

3   ответа
3

Из обсуждения кажется, что вы храните данные ни в чем, кроме огромного огромного разногласия (не часто я говорю это с открытым лицом;)) Возможно, смещение данных в правильную базу данных, такую как redis, может уменьшить использование памяти python. Это также может сделать ваши данные более эффективными и быстрее работать с ними.

3

Ваша проблема не может быть связана с чрезмерным использованием памяти. Чем больше памяти использует система, темfaster это работает. Вот почему мыadd память для системы, чтобы улучшить ее производительность. Если вы думаете, что использование меньшего количества памяти каким-то образом сделает систему быстрее, выньте часть памяти. Это заставит его использовать меньше памяти. Но, что неудивительно, это будет медленнее, если вы сделаете это.

Система поддерживает использование памяти, потому что она требует усилий, чтобы освободить память. И в этом нет никакой пользы, поскольку свободная память ничего не делает. Это не так, как если бы вы сегодня использовали вдвое меньше, завтра вы можете использовать вдвое больше. Если системе для чего-то требуется память, она может легко просто перемещать память непосредственно из одного использования в другое - ей не нужно много памяти, сидящей без дела.

Современные операционные системы оставляют только небольшой объем свободной памяти, чтобы справиться с некоторыми типами необычных случаев, когда они не могут передавать память из одного использования в другое. В Linux вы можете узнать, сколько свободной памяти требуется системе, с помощью этой команды:sysctl vm.min_free_kbytes, Вы, вероятно, обнаружите, что примерно столько свободной памяти у вас есть - и это хорошо, потому что это то, что нужно системе.

Так что вам не нужно или вы хотите освободить память. Вы хотите выяснить, почему ваша система работает медленно.

Update: По вашей новой информации, это выглядитSE_doc_parse.py сильно хлопает процессором. Я бы посмотрел на оптимизацию этого кода, если это возможно.

UpdateПохоже, что это был неэффективный словарный алгоритм, который использовался сверх тех размеров, для которых он был предназначен для масштабирования и загрузки процессора.

@EOL: обмен не является исключением. Чем больше физической памяти использует система, тем меньше она переставляет. Даже при замене системы, чем больше физической памяти используется, тем быстрее она работает.
Этот ответ должен быть квалифицированным: обмен должен быть включен в картину. Когда память переходит с ОЗУ на диск, программы работают медленнее. Важно уточнить: «Чем больше памяти использует система, тем быстрее она работает».
Хотя я согласен с вами на техническом уровне, вы наверняка понимаете, что «вынимаете память из компьютера». это менее распространенный способ, чем «написание программы, поэтому она занимает меньше памяти». Я утверждаю, что большинство читателей захотят, чтобы вы обсудили второе значение вместо первого (в том числе оригинальный постер, которому нужно решение своей проблемы вместо теоретического обсуждения того, что он никогда не сделает, - удалите физическую память со своего компьютера).
Правда, но оригинальный постер, возможно, думал о памяти, используемой егоprogramа не память, доступную на его компьютере, поэтому ваше замечание можно понимать как «чем больше физической памяти использует программа, тем меньше она переставляет». Конечно, ваше замечание является технически правильным, но обращение к исходным постерам напрямую, а не к дополнительному замечанию относительно ОЗУ компьютера, было бы менее запутанным.
@EOL: Он говорит: «После того, как я остановлю процесс индексации, память все еще заполнена». Как это может быть о памяти, используемой его программой? И "чем больше физической памяти использует программа, тем меньше она переставляет" являетсяcorrect, При прочих равных условиях, если вы заставите программу использовать меньше физической памяти, она будет меняться больше. (Проверьте это. Извлеките физическую память, заставив программу использовать меньше, и посмотрите, что происходит с производительностью.) Использование физической памятиgood, Если у вас есть память, сидящая в системе (и он делает), использование ееfree.
1

Я предполагаю, что ваша программа замедляется из-за хотя бы одной из следующих причин:

  • Your memory starts swapping, with data going from RAM to disk and vice versa. The solution is indeed that your program use less memory.
  • The algorithm that you use scales badly with the data size. In this case, finding a better algorithm is obviously the solution.

В обоих случаях нам нужно было бы увидеть какой-то ваш код (что он, по сути, составляет), чтобы дать более конкретное решение.

Общие решения включают

  • Using Python's del in order to indicate that a variable is not needed anymore.
  • Using iterators instead of lists (iterators do not use much memory).
@DavidSchwartz: Я вижу, что вы говорите, о кеше и используемом пространстве подкачки. Тем не менее, не ясно, когда результатfree -t был получен. Может быть, это после запуска программы, а не в течение некоторого времени обмена ??
Если бы это было после того, как программа была запущена, то это показывает, что программа сама не использовала много памяти, потому что память, которую использовала программа, вероятно, все еще была бы свободна, так как система еще не сделала бы ее кэширование. (Кроме того, вначале бесполезно выдвигать самые невероятные гипотезы. Когда вы слышите отпечатки копыт, начните с предположения, что это лошади, а не зебры. По крайней мере, пока вы не увидите доказательства обратного.)
Он опубликовал свою статистику. Его размер кэша значительно превышает его пространство подкачки. Его система не обменивается. (Скорее всего, он просто однажды выгружал данные, которые никогда не использовались с момента запуска системы.)
Вы можете быть правы насчетdel, Утечка памяти, даже если она не использует системную память (что в этом случае не происходит) может разрушить эффективность памяти вашего кода, поскольку его рабочий набор не помещается в кэш. Это может вызвать чрезмерное использование процессора.

Похожие вопросы