首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python tracemalloc模块分配统计信息何时会与ps或pmap中显示的统计信息不匹配?

python tracemalloc模块分配统计信息何时会与ps或pmap中显示的统计信息不匹配?
EN

Stack Overflow用户
提问于 2018-05-03 06:46:42
回答 2查看 5K关注 0票数 9

我在努力找出一个内存泄漏,所以我做了

代码语言:javascript
复制
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内存在pspmap中分配(在运行命令之前和之后以及在运行垃圾收集之后进行检查)。此外,tracemalloc.get_traced_memory确认tracemalloc没有看到太多的分配。pympler也没有看到分配。

有人知道什么时候会发生这种事吗?有些模块正在使用cython,这会导致tracemalloc的问题吗?

在pmap中,分配如下:

0000000002183000 6492008 6491876 6491876 rw--- [ anon ]

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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来跟踪它。

票数 12
EN

Stack Overflow用户

发布于 2018-05-04 11:41:00

增加了@danny的回答,因为它太长了,不能发表评论。

正如在佩普-464中解释的那样,tracemalloc使用佩普-445中引入的功能来跟踪内存分配。

通常,为了能够为C扩展使用PyMem_RawMalloc而不是malloc,人们必须使用tracemalloc。但是,由于相当长的一段时间也使用PyTraceMalloc_Track和来自pymem.hPyTraceMalloc_Untrack作为malloc的补充(而不是用PyMem_RawMalloc代替它)。

例如,在numpy中使用的是numpy,因为为了能够包装原始-c-指针并接管它的所有权,numpy使用了malloc,而不是针对小对象优化的python,这并不是numpy最关键的场景,正如我们可以看到的这里

代码语言:javascript
复制
/*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来注册所有内存分配。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50148554

复制
相关文章

相似问题

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