2015-07-10 15 views
6

Tôi rất mới đối với Python C-API và tạo mô-đun. Tôi đã cố tạo một mô-đun python c-hash. Tôi sử dụng trăn 3.4.3 và TDM-gcc (64bit) 4.9.2 để biên dịch trên Windows.C Mô-đun Python với cách sử dụng bộ nhớ khác thường

Ở đây mã của tôi:

// 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); 
} 

Các 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]) 

Việc lập hoạt động tốt nhưng khi tôi cố gắng để import module băm của tôi trong phiên dịch, ký ức của tôi làm cho một bước nhảy lớn , nhiều hơn 2Go cho quy trình python.exe.

Dưới đây là một hình ảnh của công việc quản lý của tôi cho thấy sử dụng bộ nhớ:

  1. >>> import hash
  2. Các import hash thúc
  3. Thoát python phiên dịch

Sau khi kết thúc nhập khẩu Tôi có thể sử dụng mô-đun của tôi và nó hoạt động tốt nhưng bộ nhớ có vẻ hơi cao.

Dường như đối với tôi, PyModule_Create thực hiện phân bổ bộ nhớ thực sự lớn. Nhưng tôi khá chắc chắn điều này không xảy ra trong mô-đun khác.

Tôi đã bỏ lỡ điều gì đó?

Sửa:

Khi tôi đã sử dụng rất nhiều RAM (hơn 2.5Go/4Go), tôi nhận được lỗi này:

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

Điều này thường xảy ra khi giá trị tăng lên. Tôi sẽ kiểm tra thông qua các giá trị của bất cứ điều gì đó là trong một vòng lặp khi module của bạn được bắt đầu. – IronManMark20

+0

Có vẻ như vấn đề xảy ra khi sử dụng phiên bản 64 bit của python. Tôi không gặp vấn đề gì khi sử dụng phiên bản 32bit. – Imp

+0

Tôi không thể tạo lại sự cố trên Linux x86. Việc tháo gỡ sẽ giúp ích. –

Trả lời

0

Như Python sử dụng một bộ thu rác nó doesn' t cần phải giải phóng bộ nhớ tại bất kỳ thời điểm cụ thể nào và bạn có thể thấy tối ưu hóa trong hành động.

Các vấn đề liên quan