2015-07-10 11 views
6

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:

  1. >>> import hash
  2. Die import hash Finish
  3. 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 
>>> 
+0

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

+0

Es scheint, das Problem kommt, wenn Sie die 64-Bit-Version von Python verwenden. Ich habe kein Problem mit der 32bit-Version. – Imp

+0

Ich kann das Problem nicht auf Linux x86 reproduzieren. Eine Demontage würde helfen. –

Antwort

0

Wie Python verwendet einen Kollektor Müll es doesn t müssen Speicher zu einem bestimmten Zeitpunkt freigeben und Sie sehen wahrscheinlich Optimierung in Aktion.