Примитивен C модул за Python изпуска памет
Добър ден! Вчера написах някаква помощна програма с помощта на модула PyJACK и внезапно открих странно изтичане на памет, добре, трудно е да не го забележите, защото след половин минута цялата памет, заедно със суапа, е в цикъл. Проблемът е, че списъкът на Python, който връща модула, остава в паметта, дори ако се извика някакъв del. Моля, изяснете дали това е нещо, което не знам/не разбирам, или е функция за грешка и как да се справя с нея като цяло? Python 2.7, xubuntu 12.04.
Ето минимален пример за проблема.
И всъщност стартирайте това:memleak_test.py
И гледам как паметта тече като водопад.
Недохранването на Python GC по някаква причина ли е или кодът ми е написан по такъв начин, че не се вписва в работния му график?
Всичко е наред със списъка, проблемът е във взаимодействието на функциите. Py_BuildValue връща нова препратка, която е обект с брой препратки, зададен на този, който вашият код сега притежава. Функцията PyList_Append не отнема този обект от вас, но също така увеличава броя на препратките с още един. Сега полученият низ ще има двама собственика - списъка и вашия код. Когато изтриете списъка, той честно ще отнеме своя един от броя на препратките, но вашият ще остане там, така че Python ще мисли, че някой, някъде, все още използва този ред.
Трябва или изрично да намалите брояча:
или използвайте функция, която не увеличава брояча (краде справка):
(В този случай използвах макроса PyList_SET_ITEM, който е точно за попълване на нови списъци.)
Печатна грешка в PyList_SET_ITEM - три параметъра, разбира се: