Jestem bardzo nowy w Pythonie C-API i tworzeniu modułów. Próbowałem utworzyć moduł pyth C-hash. Używam python 3.4.3 i TDM-gcc (64bit) 4.9.2 dla kompilacji w systemie Windows.C Moduł Pythona z nietypowym wykorzystaniem pamięci
Oto mój kod:
// hash_mod.c
#include <Python.h>
unsigned long _hash(unsigned char const* str)
{
unsigned long hash = 5381;
int c;
int i;
i = 0;
while (str[i] != '\0')
{
c = str[i];
hash = ((hash << 5) + hash) + c;
++i;
}
return hash;
}
static PyObject*
hash_hash(PyObject* self, PyObject* args)
{
unsigned char const* str;
if (!PyArg_ParseTuple(args, "s", &str))
return NULL;
return PyLong_FromUnsignedLong(_hash(str));
}
static PyMethodDef HashMethods[] = {
{"hash", hash_hash, METH_VARARGS, "String Hash"},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef HashModule = {
PyModuleDef_HEAD_INIT,
"hash",
NULL,
-1,
HashMethods,
NULL,
NULL,
NULL,
NULL
};
PyMODINIT_FUNC
PyInit_hash(void)
{
return PyModule_Create(&HashModule);
}
setup.py:
# setup.py
from distutils.core import setup, Extension
module1 = Extension('hash', sources = ['hash_mod.c'])
setup (name = 'Hash',
version = '1.0',
description = 'String Hash',
ext_modules = [module1])
Kompilacja działa dobrze, ale gdy próbuję zaimportować moduł mieszania w tłumacza, moja pamięć zrobić wielki skok , więcej niż 2Go dla procesu python.exe.
Oto zdjęcie mojej menedżer zadań pokazuje zużycie pamięci:
>>> import hash
import hash
wykończenie- Wyjście interpreter Pythona
po zakończeniu importu mogę korzystać z modułu i działa dobrze, ale pamięć wydaje się nieco wysoka.
Wydaje mi się, PyModule_Create robi naprawdę dużą alokację pamięci. Ale jestem prawie pewien, że tak się nie dzieje w innym module.
Czy coś mi umknęło?
Edit:
Kiedy już używać dużo pamięci RAM (ponad 2.5Go/4Go), otrzymuję ten błąd:
>>> import hash
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
>>>
Zdarza się to często, gdy wartość rośnie. Sprawdziłbym wartości wszystkiego, co jest w pętli, kiedy twój moduł jest inicjowany. – IronManMark20
Wygląda na to, że problem pojawia się podczas korzystania z 64-bitowej wersji Pythona. Nie mam żadnego problemu z używaniem wersji 32-bitowej. – Imp
Nie mogę odtworzyć problemu w systemie Linux x86. Pomocny byłby demontaż. –