Python中的MemoryError钩子?
问题内容:
有没有一种方法可以全局捕获MemoryError异常,以便库可以清除缓存,而不是让用户代码看到MemoryError?
我正在用Python开发一个内存缓存库,用于存储非常大的对象,以至于用户通常希望使用所有可用的RAM来简化脚本和/或加速脚本。我希望能够有一个钩子,其中python解释器要求回调函数释放一些RAM,以避免在用户代码中调用MemoryError。
操作系统:Solaris和/或Linux
Python:cPython 2.6。*
编辑:
我正在寻找一种机制,不会被除外块处理。如果由于某种原因在任何代码中都会出现内存错误,我想让Python解释器首先尝试使用回调释放一些RAM,并且永远不会产生MemoryError异常。我不控制会生成错误的代码,我希望缓存能够根据需要积极使用尽可能多的RAM,并根据用户代码的需要自动释放RAM。
问题答案:
这不是处理内存管理的好方法。在看到MemoryError时,您已经处于临界状态,内核可能已经接近杀死进程以释放内存,在许多系统上,您将永远看不到它,因为它将进行交换或只是OOM-
杀死您的进程,而不是失败分配。
您可能会看到MemoryError的唯一可恢复的情况是,在尝试进行不适合可用地址空间的非常大的分配之后,这仅在32位系统上很常见。
如果您希望有一个高速缓存可以根据其他分配的需要释放内存,则它不需要与 error
接口,而是与分配器本身接口。这样,当您需要释放内存以进行分配时,您将知道 需要多少
连续内存,否则您将盲目猜测。这也意味着您可以在内存分配发生时进行跟踪,因此可以将内存使用情况保持在特定级别,而不是让其不受限制地增长,然后在内存分配过高时尝试恢复。
我强烈建议,对于大多数应用程序而言,这种缓存行为过于复杂-通常,最好只使用一定数量的内存进行缓存。