Я читаю списки из большого файла, который в конечном итоге я хочу сохранить как array.array
. ПосколькуПочему мой модуль C протекает в памяти?
map(int, line.split())
очень медленно, я написал небольшой модуль C, который делает strtok и более быструю версию atoi:
inline long
minhashTables_myatoi(const char* s)
{
int r;
for (r = 0; *s; r = r * 10 + *s++ - '0');
return r;
}
static PyObject*
minhashTables_ints(PyObject *self, PyObject *args)
{
char* s;
Py_ssize_t slen;
if(!PyArg_ParseTuple(args, "s#", &s, &slen))
return NULL;
long* buf = malloc(sizeof(long) * (slen+1)/2);
const char* tok = strtok(s, " ");
buf[0] = minhashTables_myatoi(tok);
Py_ssize_t i;
for(i = 1; (tok = strtok(NULL, " ")) != NULL; i++)
buf[i] = minhashTables_myatoi(tok);
Py_ssize_t buflen = i;
PyObject* list = PyList_New(buflen);
PyObject *o;
for(i = 0; i < buflen; i++)
{
o = PyInt_FromLong(buf[i]);
PyList_SET_ITEM(list, i, o);
}
free(buf);
return list;
}
Так что мой питон скрипт вызывает ints()
со строкой, и передает ее в array.array
конструктор и сохраняет полученный массив в list
.
Моя проблема заключается в том, что в настоящее время сценарий утечки памяти, который он не сделал с картой, а не с функцией ints()
, конечно.
Также, используя мою собственную версию Pythons int()
с использованием модуля C, не происходит утечка памяти.
Благодарим за помощь!
Edit: Для VALGRIND модуль я использовал этот скрипт:
import minhashTables
data = ' '.join(map(str, range(10)))
print 'start'
foo = minhashTables.ints(data)
del data
del foo
print 'stop'
И я бегу valgrind --tool=memcheck --leak-check=full --show-reachable=yes python test.py
, но так не выход из Valgrind между start
и stop
, через есть тонны до и после этого.
Edit: Код подтверждения травит: импорт minhashTables
for i in xrange(1000000000):
data = ' '.join(map(str, range(10, 10000)))
foo = minhashTables.ints(data)
Я должен воссоздать строку, потому что strtok изменяет его. Кстати, копирование строки в другую ячейку памяти не изменяет поведения.
Возможно, вам захочется взглянуть на функции NumPy [loadtxt()] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html#numpy.loadtxt) и [ genfromtxt()] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html#numpy.genfromtxt). Они довольно быстры. –
Вы знаете о 's #', правильно? –
Мне нужно хранить разные части файла в разных массивах, поэтому, к сожалению, я не хочу читать весь файл. Что такое #? – chuck