【问题标题】:How to debug a MemoryError in Python? Tools for tracking memory use?如何在 Python 中调试 MemoryError?跟踪内存使用的工具?
【发布时间】:2010-12-13 12:02:51
【问题描述】:

我有一个 Python 程序,当我给它一个大文件时,它会因 MemoryError 而死。有什么工具可以用来找出内存在使用吗?

这个程序在较小的输入文件上运行良好。该程序显然需要一些可扩展性改进;我只是想弄清楚在哪里。正如一位智者所说,“在优化之前先进行基准测试”。

(只是为了防止不可避免的“添加更多 RAM”答案:这是在具有 4GB RAM 的 32 位 WinXP 机器上运行的,因此 Python 可以访问 2GB 的可用内存。添加更多内存在技术上是不可能的。重新安装我的带有 64 位 Windows 的 PC 不实用。)

编辑:哎呀,这是Which Python memory profiler is recommended?的副本

【问题讨论】:

  • 是我自己还是所有这些工具都只显示对象的数量,我很想知道这些都在哪里。

标签: python memory-management profiling out-of-memory


【解决方案1】:

Heapy 是 Python 的内存分析器,这是您需要的工具类型。

【讨论】:

【解决方案2】:

最简单和轻量级的方法可能是使用 Python 的 built in memory query capabilities,例如 sys.getsizeof - 只需在您的对象上运行它以减少问题(即较小的文件),看看什么会占用大量内存.

【讨论】:

  • 良好且快速的解决方案。但是有一些限制,因为您需要知道它是哪个对象(或有根据的猜测)。此外,在包含 100 个 100 MB 对象的列表上执行此操作将返回 100 个指针的大小(因此只有几 KB)...
【解决方案3】:

在您的情况下,答案可能很简单:不要一次读取整个文件,而是逐块处理文件。根据您的使用场景,这可能非常简单或复杂。举个例子,对于大文件,MD5 校验和计算可以更有效地完成,而无需读取整个文件。后一种变化在某些 SCons 使用场景中显着减少了内存消耗,但几乎不可能使用内存分析器进行跟踪。

如果您仍然需要内存分析器:eliben 已经建议使用 sys.getsizeof。如果还是不行,试试 Heapy 或 Pymler。

【讨论】:

    【解决方案4】:

    您要求提供工具推荐:

    Python 内存验证器允许您监控 Python 应用程序的内存使用情况、分配位置、GC 集​​合、对象实例、内存快照等。仅限 Windows。

    http://www.softwareverify.com/python/memory/index.html

    免责声明:我参与了该软件的创建。

    【讨论】:

    • 为什么只有 Windows?您必须意识到这只是一小部分 Python 开发人员。
    猜你喜欢
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2020-08-22
    • 2019-02-21
    • 1970-01-01
    • 2011-08-24
    • 2012-10-14
    相关资源
    最近更新 更多