embed python如何得知python占用的内存呢?

答案是:不可知的。这就是embed python不如lua的地方,lua不仅可以通过collectgarbage("count")来得到占用内存
还可以传入自定义的lua_Alloc函数分配器:
lua_State *lua_newstate (lua_Alloc f, void *ud);
embed python只能去感知他占用的内存大小,比如在程序退出时,把自己的对象全部销毁了,剩下的大概就是python占用的内存。
如果就此止步不是我们的风格,我们直接重写malloc和free
int g_py_malloc = 0;
PyAPI_FUNC(int) py_get_memory_cost()
{
	return g_py_malloc;
}
void *py2_malloc(unsigned int num_bytes)
{
	void* p = malloc(num_bytes + 4);
	int* size = (int*)p;
	*size++ = num_bytes;
	g_py_malloc += num_bytes;
	return size;
}
void *py2_realloc(void* p,unsigned int num_bytes)
{
	int* size;
	int sz;
	if (p == 0)
		return py2_malloc(num_bytes);
	size = (int*)p;
	sz = *--size;
	p = realloc(size,num_bytes+4);
	size = (int*)p;
	*size++ = num_bytes;
	g_py_malloc += num_bytes - sz;
	return size;
}
void py2_free(void* p)
{
	int* size;
	if (p == 0)
		return;
	size = (int*)p;
	g_py_malloc -= *--size;
	free(size);
}

  解释一下做法,就是多分配1个int在内存头记录分配的大小即可。

  然后把python中的obmalloc.c 和 pymem.h中的malloc,realloc,free分别替换为新的,改动不大可以接受。注意:也许在多线程下有bug。

posted on 2011-09-28 17:26  风行水上  阅读(668)  评论(0编辑  收藏  举报