我在努力找出一个内存泄漏,所以我做了
import tracemalloc
tracemalloc.start()
<function call>
# copy pasted this from documentation
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')
print("[ Top 10 ]")
for stat in top_stats[:10]:
print(stat)这表明没有主要的分配,所有内存分配都很小,而我看到8+ GB内存在ps和pmap中分配(在运行命令之前和之后以及在运行垃圾收集之后进行检查)。此外,tracemalloc.get_traced_memory确认tracemalloc没有看到太多的分配。pympler也没有看到分配。
有人知道什么时候会发生这种事吗?有些模块正在使用cython,这会导致tracemalloc的问题吗?
在pmap中,分配如下:
0000000002183000 6492008 6491876 6491876 rw--- [ anon ]
发布于 2018-05-03 13:35:53
来自[医]铁线的文档
The tracemalloc module is a debug tool to trace memory blocks allocated by Python.
换句话说,tracemalloc看不到python解释器未分配的内存。这将包括PyMalloc在C级别上没有执行的任何操作,包括通过扩展使用的本机代码调用的所有标准libc malloc调用,或者直接使用malloc的扩展代码。
如果没有代码复制,这里是否是这样的情况是不可能确定的。您可以尝试在python之外运行本机代码部分,例如val差制,以检测本机代码中的内存泄漏。
如果有执行malloc的cython代码,则可以切换到PyMalloc来跟踪它。
发布于 2018-05-04 11:41:00
增加了@danny的回答,因为它太长了,不能发表评论。
正如在佩普-464中解释的那样,tracemalloc使用佩普-445中引入的功能来跟踪内存分配。
通常,为了能够为C扩展使用PyMem_RawMalloc而不是malloc,人们必须使用tracemalloc。但是,由于相当长的一段时间也使用PyTraceMalloc_Track和来自pymem.h的PyTraceMalloc_Untrack作为malloc的补充(而不是用PyMem_RawMalloc代替它)。
例如,在numpy中使用的是numpy,因为为了能够包装原始-c-指针并接管它的所有权,numpy使用了malloc,而不是针对小对象优化的python,这并不是numpy最关键的场景,正如我们可以看到的这里。
/*NUMPY_API
* Allocates memory for array data.
*/
NPY_NO_EXPORT void *
PyDataMem_NEW(size_t size)
{
void *result;
result = malloc(size);
if (_PyDataMem_eventhook != NULL) {
NPY_ALLOW_C_API_DEF
NPY_ALLOW_C_API
if (_PyDataMem_eventhook != NULL) {
(*_PyDataMem_eventhook)(NULL, result, size,
_PyDataMem_eventhook_user_data);
}
NPY_DISABLE_C_API
}
PyTraceMalloc_Track(NPY_TRACE_DOMAIN, (npy_uintp)result, size);
return result;
}因此,从根本上说,C扩展向tracemalloc-module报告内存分配是C扩展的责任,另一方面,不能真正信任tracemalloc来注册所有内存分配。
https://stackoverflow.com/questions/50148554
复制相似问题