gpt4 book ai didi

python - 如何记录 python MemoryError(当我内存不足时)

转载 作者:太空狗 更新时间:2023-10-30 00:56:19 25 4
gpt4 key购买 nike

作为我的一个程序的一部分,我想捕获任何MemoryError 并记录它们。目前,我正在使用 traceback.format_exception 来格式化所有其他异常;我也想为 MemoryError 这样做。

但是,使用format_exception需要占用更多的内存,这正是我在内存不足时无法做到的。

做什么?

当我抛出一个 MemoryError 除了终止之外我还能做什么?理想情况下,我会记录它们,然后在假设释放处理程序和 thrower* 之间的堆栈部分已经释放足够的内存让我这样做的情况下恢复程序。

(* 还有那些堆对象仅通过从该堆栈部分发出的引用保持事件状态)

最佳答案

它确实与“堆栈”关系不大。当系统 malloc()(或类似的平台函数)返回 NULL 时,Python 引发 MemoryError。在那种情况下,实际上并没有分配新的内存!因此,与触发 MemoryError 的请求之前一样多的剩余可用内存。例如,在 32 位机器上的交互式 shell 中:

>>> x = [None] * 10**9
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
>>>

那是无害的。是的,在现实的程序中,其他内存可能会随着堆栈展开而被释放。

但是,如果再次尝试相同(或类似)任务时“只是继续”不会导致另一个 MemoryError,那么您的程序一定有一些不寻常的地方。最明智的做法确实通常是退出程序并重新开始。

@FredMitchell 保留一些“紧急内存”的想法可能值得追求。例如,

emergency = 'x' * 10**7

消耗大约 10 MB(在 Python 2 中),大部分在“一大块”中,您的处理程序可以做到

emergency = ""

将其释放回系统。然后 malloc() 将有一个新的 10MB 的连续 block 可以使用。

但是,最终,我敢打赌,戒烟会容易得多 ;-)

关于python - 如何记录 python MemoryError(当我内存不足时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19469608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com