Ich bin sehr neu in Python C-API und Modul-Erstellung. Ich habe versucht, ein c-Hash-Python-Modul zu erstellen. Ich verwende Python 3.4.3 und TDM-gcc (64bit) 4.9.2 für die Kompilierung unter Windows.C Python-Modul mit ungewöhnlichen Speichernutzung
Hier mein Code:
// 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);
}
Die 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])
Die Zusammenstellung funktioniert gut, aber wenn ich versuche, mein Hash-Modul in dem Interpreter zu importieren, mein Gedächtnis einen großen Sprung machen , mehr als 2Go für die python.exe Prozess.
Hier ist ein Bild von meinem Task-Manager Speichernutzung zeigt:
>>> import hash
- Die
import hash
Finish - Beenden Python-Interpreter
Nach dem Import Finish ich mein Modul verwenden können, und es funktioniert gut, aber die Erinnerung scheint ein bisschen hoch zu sein.
Es scheint für mich die PyModule_Create macht eine wirklich große Speicherzuweisung. Aber ich bin mir ziemlich sicher, dass das in anderen Modulen nicht passiert.
Habe ich etwas übersehen?
bearbeiten:
Wenn ich schon viel RAM verwenden (mehr als 2.5Go/4Go), bekomme ich diesen Fehler:
>>> import hash
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
>>>
Dies tritt häufig auf, wenn ein Wert erhöht wird. Ich würde die Werte von allem überprüfen, was in einer Schleife ist, wenn Ihr Modul initiiert wird. – IronManMark20
Es scheint, das Problem kommt, wenn Sie die 64-Bit-Version von Python verwenden. Ich habe kein Problem mit der 32bit-Version. – Imp
Ich kann das Problem nicht auf Linux x86 reproduzieren. Eine Demontage würde helfen. –