Python中的MemoryError钩子?

Python中的MemoryError钩子?,python,memory-management,caching,Python,Memory Management,Caching,是否有一种全局捕获MemoryError异常的方法,以便库可以清除缓存,而不是让用户代码看到MemoryError 我正在用Python开发一个存储非常大对象的内存缓存库,用户通常希望使用所有可用的RAM来简化脚本和/或加速脚本。我希望能够有一个钩子,python解释器在其中请求回调函数释放一些RAM,以避免在用户代码中调用MemoryError 操作系统:Solaris和/或Linux Python:cpython2.6* 编辑:我正在寻找一种不会被except块处理的机制。如果在任何代码中

是否有一种全局捕获MemoryError异常的方法,以便库可以清除缓存,而不是让用户代码看到MemoryError

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

操作系统:Solaris和/或Linux

Python:cpython2.6*



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

A
MemoryError
是一个例外,您应该能够在除块之外的
块中捕获它。

这不是处理内存管理的好方法。当您看到MemoryError时,您已经处于关键状态,内核可能接近于终止进程以释放内存,在许多系统上,您将永远看不到它,因为它将进行交换或终止进程,而不是失败分配

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

如果您想拥有一个缓存,以便根据其他分配的需要释放内存,那么它不需要与错误交互,而需要与分配器本身交互。这样,当您需要释放内存进行分配时,您将知道需要多少连续内存,否则您将盲目猜测。这还意味着您可以在内存分配发生时跟踪它们,这样您就可以将内存使用率保持在特定的水平,而不是让它不受约束地增长,然后在内存分配过高时尝试恢复


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

我希望能对Glenn的答案发表评论。。。虽然我同意反对使用MemoryException作为处理缓存大小的方法的总体想法,但这并不一定意味着当您捕获它们时,您的系统就是我们的重击。有些人不用交换就可以运行,当使用ulimit限制最大进程大小时,您也可以使用它们。此外,当使用软限制时,您甚至可以提高软限制以优雅地处理内存耗尽导致的进程死亡(假设有一种方法可以在不分配任何内存的情况下提高它;我还从未尝试过)

捕获一个未捕获的异常意味着发生了错误,而您不知道发生了什么。这意味着您的应用程序可能开始以意外的方式运行,就像您开始删除随机代码行一样!我在一些应用程序中使用了通用异常处理程序,但只是为了向用户显示一条好消息(对于GUI特别有用),然后就消失了

您可以将异常处理程序挂接为:

sys.excepthook = <your_exceptionhook>
sys.excepthook=
参数是异常类、异常实例和回溯对象。您可以按相同的顺序将这些参数传递给traceback.format_exception()以生成跟踪消息python在未捕获异常时写入stderr


注意:我没有尝试过它是否对MemoryException错误有用,但这是捕获未捕获异常的方式。

我试图澄清这个问题。我希望我的库能够在任何代码中拦截MemoryError的创建,而该代码除了其中的块之外,不会有任何尝试。