Написах програма на Python, която трябва да работи няколко дни наведнъж, поради постоянното събиране на данни. Преди това нямах проблеми с тази програма в продължение на месеци. Наскоро направих някои актуализации на програмата и сега след около 12 часа получавам страховития убиец на паметта. Изходът "dmesg" е следният:
[9084334.914808] Out of memory: Kill process 2276 (python2.7) score 698 or sacrifice child
[9084334.914811] Killed process 2276 (python2.7) total-vm:13279000kB, anon-rss:4838164kB, file-rss:8kB
Освен общото кодиране на Python, основната промяна, направена в програмата, беше добавянето на опашка за многопроцесорна обработка. Това е първият път, когато използвам тази функция, така че не съм сигурен дали това може да е причината за проблема. Целта на опашката в моята програма е да може да прави динамични промени в паралелен процес. Опашката се инициира в основната програма и непрекъснато се наблюдава в паралелния процес. Опростена версия на това как правя това в паралелния процес е следната (като 'q' е опашката):
while(1):
if q.empty():
None
else:
fr = q.get()
# Additional code
time.sleep(1)
Динамичните промени на 'q' не се случват много често, така че по-голямата част от времето q.empty() ще бъде вярно, но цикълът е там, за да бъде готов веднага щом бъдат направени промените. Въпросът ми е дали изпълнението на този код за няколко часа наведнъж ще доведе до изчерпване на паметта? Тъй като цикълът „while“ е доста кратък и работи основно нон стоп, мислех, че това може да е проблем. Ако това може да е причината за проблема, някой има ли някакви предложения как да се подобри кодът, така че убиецът на недостиг на памет да не бъде извикан?
Благодаря ти много.
if q.empty(): pass
е идиоматичният начин за запис на този блок. Но би било още по-добре просто да иматеif not q.empty(): fr = q.get()
на първо място. - person Henry Keiter   schedule 27.02.2014.get()
премахва ли елемента от опашката или само го инспектира? В последния случай размерът на опашката монотонно нараства. - person Stefano Sanfilippo   schedule 27.02.2014free
? - person SingleNegationElimination   schedule 27.02.2014