Python: утечка памяти в CTypes с помощью Structure - PullRequest
3 голосов
/ 17 сентября 2011

Имеет ли Python ctypes известную утечку памяти?Я работаю над скриптом Python, имеющим код, подобный приведенному ниже, с использованием ctypes, который по какой-то причине вызывает утечку памяти.«while True» в этом примере - проверка на утечку, вызванную вызовом функции.Он запускается в Windows с Python 2.5.4:

import ctypes
def hi():
    class c1(ctypes.Structure):
            _fields_=[('f1',ctypes.c_uint8)]
    class c2(ctypes.Structure):
            _fields_=[('g1',c1*2)]

while True:
    test=hi()

Утечка может быть проверена с помощью ProcessExplorer - поскольку он продолжает работать, Python продолжает занимать все больше и больше памяти.Кажется, требуется наличие двух подклассов структуры, где один из классов имеет «кратное» другого (используя оператор *), но я не уверен, является ли условие более базовым, чем это.Даже если в цикл добавлено del test, это все равно приводит к утечке памяти.

Любые идеи о том, что может быть причиной этого?

Редактировать: потому что кто-то предположил, что он может еще не собрать мусорВот отредактированная версия, которая выполняет сборку мусора, но все еще, кажется, утечка памяти:

import gc
import ctypes
def hi():
    class c1(ctypes.Structure):
            _fields_=[('f1',ctypes.c_uint8)]
    class c2(ctypes.Structure):
            _fields_=[('g1',c1*2)]

while True:
    test=hi()
    test2=gc.collect()

Ответы [ 2 ]

2 голосов
/ 17 сентября 2011

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

ProcessExplorer не является хорошим средством отладки, особенно для памяти.

1 голос
/ 17 сентября 2011

Скрипт сам по себе не пропускает. Запуск с gc.set_debug(gc.DEBUG_LEAK) показывает, что созданные типы структур являются собираемыми, а gc.garbage остается пустым в каждой итерации цикла, поэтому нет объектов, которые невозможно собрать. Выполнение сценария с time в системе Linux также не показывает постоянного увеличения потребления памяти.

...