首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CPython内存管理

CPython内存管理
EN

Stack Overflow用户
提问于 2016-07-20 21:13:10
回答 1查看 123关注 0票数 0

我正在一个C库上编写一个CPython模块mrloader,我编译了源代码,并开始做一些测试。

Python需要4 Gb的RAM来运行100次迭代循环来从网络中获取一些数据。这是一个大问题,所以我使用resource来限制内存量,并测试Python是否释放了内存。我有一台Segmentation fault

我使用this文档和this来编写模块,在收集对象时我认为我做错了什么,因为如果不限制内存,它将完成100循环,但它使用了4 4Gb的内存。

在mrloader CPython代码中,我有一个结构,如下所示:

代码语言:javascript
复制
typedef struct {
    PyObject_HEAD
    AL_KEY ienaKey;
    char* dataPath;
    int nbParams;
    char** pListOfParams;
    CLIST_S* listParam;
    AL_DEFP_S *pListeParamInfo;
    int* pIndexParamIsTopana;
} MRLoader;

Python测试如下所示:

代码语言:javascript
复制
def limit_memory(maxsize):
    soft, hard = resource.getrlimit(resource.RLIMIT_AS)
    resource.setrlimit(resource.RLIMIT_AS, (maxsize, hard))

limit_memory(8589934592/10)

for i in xrange(100):
    print '----------------------------', i, '--------------------------' 
    obj = MRLoader.MRLoader(MR)
    obj.initReaderCadence(paramList, cadence, zdtStart, zdtStop)
    print obj.getData()
    obj.closeAll()

在CPython代码中,destructor声明如下:

代码语言:javascript
复制
static void MRLoader_dealloc(MRLoader *self){
    self->ob_type->tp_free((PyObject *)self);
}

我是否正确地释放了内存?

感谢你花时间帮助我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-21 16:12:56

我找到了解决方案,我使用了PyArrayObject,我在声明的结构中没有为它保留一个指针。由于这个巨大的numpy数组,内存没有被释放。

所以我的结构现在看起来像这样:

代码语言:javascript
复制
typedef struct {
    PyObject_HEAD
    AL_KEY ienaKey;
    char* dataPath;
    int nbParams;
    char** pListOfParams;
    CLIST_S* listParam;
    AL_DEFP_S *pListeParamInfo;
    int* pIndexParamIsTopana;
    // Added this pointer to the numpy array
    reel64* pValueArray;
} libzihc_MRLoader;

在释放函数中,我在销毁PyObject本身之前调用了free()。现在程序使用的内存不超过100Mb,数组很大。

释放函数:

代码语言:javascript
复制
static void MRLoader_dealloc(MRLoader *self){
    free(self->pValueArray)
    self->ob_type->tp_free((PyObject *)self);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38482327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档