Надо в Питоне вызвать С-шный код, но начиная с самого простого теста уперся в утекание памяти.
Плз поправьте меня что и где?
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 - но обнаружил утечку памяти уже на этапе простейшего модуля на Це.
Спасибо.