代码之家  ›  专栏  ›  技术社区  ›  Mr Fooz

巨蟒中的记忆钩子?

  •  3
  • Mr Fooz  · 技术社区  · 14 年前

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

    操作系统:Solaris和/或Linux

    Python:cPython 2.6*


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

    3 回复  |  直到 14 年前
        1
  •  4
  •   Glenn Maynard    14 年前

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

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

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

        2
  •  1
  •   drxzcl    14 年前

    MemoryError 是个例外,你应该能够在 except 封锁。

        3
  •  1
  •   Thomas Guyot-Sionnest    11 年前

    我希望我能对格伦的回答发表评论。。。虽然我同意不使用MemoryException作为处理缓存大小的方法的总体想法,但这并不一定意味着当您捕获它们时,您的系统会崩溃。有些人运行时没有交换,当使用ulimit来限制最大进程大小时,您也可以得到他们。另外,当使用软限制时,您甚至可以提高软限制来优雅地处理内存耗尽时的死亡(假设有一种方法可以提高它而不分配任何内存;我还没有尝试过)。

    您可以这样挂接异常处理程序:

    sys.excepthook = <your_exceptionhook>
    

    参数包括异常类、异常实例和回溯对象。可以按相同的顺序将这些参数传递给traceback.format_exception(),以生成python在未捕获异常时写入stderr的回溯消息。