2015-07-10 23 views
6

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:

  1. >>> import hash
  2. import hash wykończenie
  3. 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 
>>> 
+0

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

+0

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

+0

Nie mogę odtworzyć problemu w systemie Linux x86. Pomocny byłby demontaż. –

Odpowiedz

0

jak Python używa śmieciarza nie robi” • musisz zwolnić pamięć w dowolnym momencie i prawdopodobnie widzisz optymalizację w działaniu.