Найти - Пользователи
Полная версия: Python + C API simple example memory leak
Начало » Python для новичков » Python + C API simple example memory leak
1
Tormalon
День добрый.

Надо в Питоне вызвать С-шный код, но начиная с самого простого теста уперся в утекание памяти.
Плз поправьте меня что и где?

CentOS 6/x86_64, Python 2.6.6

Считывание информации о памяти заточено под линух.
Код питона a.py:
import re
import test
# Collecting memory usage statistics
f = open('/proc/self/status', 'r')
save1 = ""
for line in f:
    if re.search(r"VmSize|VmRSS", line):
        save1 += " " + line.rstrip()
f.close()
# Running 100500 millions of tests
for x in range(0, 10000000):
    a = test.test()
    a = None
# Collecting memory statistics after test
f = open('/proc/self/status', 'r')
save2 = ""
for line in f:
    if re.search(r"VmSize|VmRSS", line):
        save2 += " " + line.rstrip()
f.close()
# Dumping stats
print save1
print save2

Простейший код модуля на C файл test.c
#include <Python.h>

static PyObject* py_test(PyObject* self, PyObject* args)
{
Py_INCREF(Py_None);
return Py_None;
}

static PyMethodDef test_methods[] = {
{"test", py_test, METH_NOARGS, "test function"},
{NULL, NULL}
};

PyMODINIT_FUNC
inittest()
{
(void) Py_InitModule("test", test_methods);
}

Сам setup.py:
from distutils.core import setup, Extension
module1 = Extension('test',
                    sources = ['test.c'])
setup (name = 'PackageName',
       version = '1.0',
       description = 'This is a test package',
       ext_modules = [module1])

Собираем модуль через
“python setup.py build”
складываем .so в каталог с основным модулем и просто запускаем его.
Получаем следующее:
$ ./a.py
VmSize: 117208 kB VmRSS: 3700 kB
VmSize: 597424 kB VmRSS: 483908 kB

За 10М запусков пустой функции процесс питона заюзал пол гига оперативки.

Плз, подскажите куда копать?
А то библиотеку уже подключил, логику портировал и разбираюсь с Py_INCREF/DECREF - но обнаружил утечку памяти уже на этапе простейшего модуля на Це.

Спасибо.
Tormalon
Пофиксено.
range -> xrange.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB