2015-07-10 17 views
6

Python C-API ve modül oluşturma konusunda çok yeni. Bir c-hash python modülü oluşturmaya çalıştım. Windows'ta derleme için python 3.4.3 ve TDM-gcc (64bit) 4.9.2 kullanıyorum. İşteC Olağandışı bellek kullanımına sahip Python Modülü

kodum:

// 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: Ben tercüman benim karma modülü almaya çalıştığınızda

# 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]) 

derleme iyi çalışıyor ama, hafızam büyük bir sıçrayış python.exe işlemi için 2Go'dan daha fazla işlem. İşte

bellek kullanımını gösteren benim görev yöneticisi bir fotoğrafı:

  1. >>> import hash
  2. benim modülünü kullanabilirsiniz import hash bitirmek
  3. Çık piton tercüman

ithalat bitirmek sonra ve iyi çalışıyor ama hafıza biraz yüksek gibi görünüyor.

Bana göre PyModule_Create gerçekten büyük bir bellek ayırma yapıyor. Ama eminim ki diğer modüllerde bu olmadı.

Bir şey mi özledim?

Düzenleme:

Python gibi
>>> import hash 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
MemoryError 
>>> 
+0

Bu, genellikle bir değer arttığında olur. Modül başlatıldığında, döngüde olan her şeyin değerini kontrol ederim. – IronManMark20

+0

Python'un 64bit sürümünü kullanırken sorun çıkıyor gibi görünüyor. 32bit sürümünü kullanarak herhangi bir sorunum yok. – Imp

+0

Bu sorunu Linux x86 üzerinde yeniden oluşturamıyorum. Bir sökme yardımcı olacaktır. –

cevap

0

o kokan bir çöp toplayıcısı kullanır:

Zaten RAM çok kullanmak (diğer 2.5Go/4Go yerine), bu hatayı alıyorum Herhangi bir zamanda belleği serbest bırakmanız gerekiyor ve muhtemelen en iyi duruma getirme işlemini görüyorsunuz.