python - python tracemalloc 模块分配统计信息何时与 ps 或 pmap 中显示的不匹配?
问题描述
我正在尝试追踪内存泄漏,所以我已经完成了
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 ]
解决方案
从tracemalloc的文档中:
The tracemalloc module is a debug tool to trace memory blocks allocated by Python.
换句话说,没有被python解释器分配的内存不会被tracemalloc看到。这将包括PyMalloc
C-API 级别未完成的任何事情,包括通过扩展使用的本机代码或直接malloc
使用的扩展代码的所有标准 libc 调用。malloc
如果没有代码来重现,这里是否是这种情况是不可能确定的。您可以尝试通过例如 valgrind 在 python 之外运行本机代码部分,以检测本机代码中的内存泄漏。
如果有 cython 代码正在执行malloc
,则可以切换到PyMalloc
对其进行跟踪。
推荐阅读
- php - 如何从导入 Excel Laravel maatwebsite 中获取价值时间
- python - SMOTE 重新采样所有类 ValueError
- amazon-web-services - 所有 s3 图片上传都不会触发 Lambda 函数
- html - Django 或 jquery 不稳定?
- pandas - 带有 groupby 的 Pandas 条件总和不起作用
- git - 为什么 vscode 无法识别我的 .git 文件夹?
- node.js - 如何在 Nodejs 中导入 TypeScript 接口
- ng-bootstrap - 我们可以请一个 ng-bootstrap 滑块吗?
- google-apps-script - 未经授权运行 Google 脚本
- css - 我怎样才能让这个不再重复?