python - Python 中的 MemoryError 钩子(Hook)?

标签 python memory-management caching

有没有办法全局捕获 MemoryError 异常,以便库可以清除缓存而不是让 MemoryError 被用户代码看到?

我正在用 Python 开发一个内存缓存库,用于存储非常大的对象,以至于用户通常希望使用所有可用的 RAM 来简化他们的脚本和/或加速它们。我希望能够有一个 Hook ,其中 python 解释器要求回调函数释放一些 RAM,以避免在用户代码中调用 MemoryError。

操作系统:Solaris 和/或 Linux

Python:cPython 2.6.*


编辑: 我正在寻找一种不会被 except block 处理的机制。如果由于任何原因在任何代码中出现内存错误,我想让 Python 解释器首先尝试使用回调来释放一些 RAM,并且永远不会生成 MemoryError 异常。我不控制会产生错误的代码,我希望我的缓存能够根据需要积极使用尽可能多的 RAM,并在用户代码需要时自动释放 RAM。

最佳答案

这不是处理内存管理的好方法。当您看到 MemoryError 时,您已经处于临界状态,内核可能接近终止进程以释放内存,并且在许多系统上您永远不会看到它,因为它会进入交换状态或只是 OOM-杀死你的进程而不是失败的分配。

您可能会看到 MemoryError 的唯一可恢复情况是在尝试进行不适合可用地址空间的非常大的分配之后,这仅在 32 位系统上很常见。

如果您希望有一个缓存可以根据其他分配的需要释放内存,它不需要与错误 交互,而是与分配器本身交互。这样,当您需要为分配释放内存时,您就会知道需要多少连续内存,否则您将盲目猜测。这也意味着您可以在内存分配发生时对其进行跟踪,这样您就可以将内存使用量保持在特定水平,而不是让它不受限制地增长,然后在它变得太高时尝试恢复。

我强烈建议,对于大多数应用程序来说,这种缓存行为过于复杂,但通常最好只使用一定数量的内存进行缓存。

关于python - Python 中的 MemoryError 钩子(Hook)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3991257/

相关文章:

python - 在没有docker的情况下运行正常时拒绝使用docker连接本地ip地址

c# - 使用 foreach 循环解析大型文本文件的奇怪行为 (C# .NET 4)

java - 如何不给Guava的LoadingCache添加空值?

python - 艰苦学习Python练习20

python - 在 python 中渲染矢量字母

c++ - 如何评估自定义内存分配器的质量?

java - 在一次采访中有人问我如何检测 Java 中的内存泄漏?

c - 定时函数调用成本

assembly - clflush 会刷新 L1i 吗?

python - 如何查询并从函数中获取最大值