我正在一个C库上编写一个CPython模块mrloader,我编译了源代码,并开始做一些测试。
Python需要4 Gb的RAM来运行100次迭代循环来从网络中获取一些数据。这是一个大问题,所以我使用resource来限制内存量,并测试Python是否释放了内存。我有一台Segmentation fault。
我使用this文档和this来编写模块,在收集对象时我认为我做错了什么,因为如果不限制内存,它将完成100循环,但它使用了4 4Gb的内存。
在mrloader CPython代码中,我有一个结构,如下所示:
typedef struct {
PyObject_HEAD
AL_KEY ienaKey;
char* dataPath;
int nbParams;
char** pListOfParams;
CLIST_S* listParam;
AL_DEFP_S *pListeParamInfo;
int* pIndexParamIsTopana;
} MRLoader;Python测试如下所示:
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声明如下:
static void MRLoader_dealloc(MRLoader *self){
self->ob_type->tp_free((PyObject *)self);
}我是否正确地释放了内存?
感谢你花时间帮助我。
发布于 2016-07-21 16:12:56
我找到了解决方案,我使用了PyArrayObject,我在声明的结构中没有为它保留一个指针。由于这个巨大的numpy数组,内存没有被释放。
所以我的结构现在看起来像这样:
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,数组很大。
释放函数:
static void MRLoader_dealloc(MRLoader *self){
free(self->pValueArray)
self->ob_type->tp_free((PyObject *)self);
}https://stackoverflow.com/questions/38482327
复制相似问题