如何在Python代码中处理“MemoryError”

时间:2017-02-05 21:34:14

标签: python exception-handling

我有一段python代码,一段时间后生成MemoryError。我知道它消耗了大量的内存。 所以,我决定将代码放在try/except块中,以便骨架如下所示:

while True:

      while True:

            try:
            #---- do some stuff

            except MemoryError as err:
                   print(err)
                   break

所以,我的想法是在while出现MemoryError时跳出第一个while循环,因为我有一个外MemoryError - 循环,它将再次启动程序。

它似乎暂时有效,但我不确定。过了一会儿,它再次停止,我需要重新启动程序。 有人知道一个更好的解决方案,以便程序可以在var lists = text.match(/\{\{(order|bulleted|unbulleted|Pagelist)(.*\n)*?\}\}/g); 之后再次运行吗?

3 个答案:

答案 0 :(得分:1)

请注意,Python只有在意识到它会事先过度使用内存时才会抛出MemoryError。如果它偶然发生(或#34;未被注意到#34;由Python),那么你运气不好。 documentation已经提到了这个:

  

的MemoryError

     

当操作耗尽内存时引发,但情况仍然可能被挽救(通过删除一些对象)。关联值是一个字符串,表示内存中耗尽了哪种(内部)操作。请注意,由于底层内存管理体系结构(C的malloc()函数),解释器可能无法始终从这种情况中完全恢复;然而它引发了一个异常,以便可以打印堆栈回溯,以防止失控程序。

因此,如果没有什么可以拯救的,或者口译员无法恢复,则没有MemoryError

一个好方法需要知道你在做什么以及如何做。在大多数情况下,生成器(例如参见PEP 289 on generator expressions)或map-reduce approaches可以为您节省大量内存。这些也适用于此。

答案 1 :(得分:1)

如果不知道你在这个尝试中做了什么,很难评估做什么,但我会尝试。

Fristtrly,关于继续try-except块。恐怕你不能这样做。

如此简短的回答是你不能回去尝试阻止发生异常的地方,你可以去第一行试试

可以做什么:

我通常会处理以下异常。像这样创建while True循环:

while True:
    try:
        #some code here
    except SomeException:
        continue

现在您可以continue在发生异常后尝试。

第二种方式(但不推荐)是使用某个函数嵌入代码并以递归方式执行它。

def foo():
    try:
        while True:
            foo2()
    except StopIteration:
        #end code

def foo2():
    while True:
        try:
            #some code here
        except MemoryError:
            foo2()
            raise StopIteration()

然而,这非常危险但是如果你的记忆被超过很多次(<1000),如果你需要在while True之前做一些事情,这可能是可行的。你需要密切关注解决方案。

答案 2 :(得分:0)

你提出一个非常含糊的问题,因为你并没有绘制填充内存的场景。

当记忆填满时你会怎么做?你把它清空了!好的做法是你必须知道你的脚本消耗了多少内存。

  • 如果您可以让您的程序分解为更多步骤并消耗更少的内存,那么就这样做吧!如果你

  • 如果您可以清空某些列表/数组并继续执行,那就去做吧!

  • 如果你认为你的程序会消耗这么多内存,那么如果发现MemoryError,并且没有编程方式,那么你的程序用户的系统不会满足使用你的程序的要求,并且因内存错误而崩溃是可以的!