【问题标题】:How to deal with "MemoryError" in Python code如何处理 Python 代码中的“MemoryError”
【发布时间】:2017-06-22 19:00:45
【问题描述】:

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

while True:

      while True:

            try:
            #---- do some stuff

            except MemoryError as err:
                   print(err)
                   break

所以,我的想法是,如果出现MemoryError,则跳出第一个while-loop,并且由于我有一个外部while-loop,它将再次启动程序。

它似乎暂时有效,但我不确定。过了一会儿,它又停止了,我需要再次重新启动程序。 有人知道更好的解决方案,以便程序可以在MemoryError 之后再次运行吗?

【问题讨论】:

  • 为了清楚起见,你问当MemoryError发生时该怎么办?
  • 是的。或者更好:MemoryError 发生后如何继续try-block?
  • 你使用什么类型的数据结构?只是标准列表和字典,或者您是否使用了一些第三方软件包,例如 numpypandas。尝试创建和使用非常大的numpy 数组时出现内存错误,因此会定期出现。
  • 在另一篇文章中你说你正在学习 Python。初学者不应该出现记忆错误,除非他们做错了什么。不要试图except出错误。弄清楚是什么在不受控制地使用内存。

标签: python exception-handling


【解决方案1】:

如果不知道您在此尝试中做了什么,很难评估该做什么,但我会尝试。

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

所以简短的回答是你不能回到 try 块到发生异常的地方,你可以去 try 的第一行

可以做什么:

我通常如下处理我的异常。像这样创建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()

但是这是非常危险但是如果您的内存被超出的次数不多(while True 之前做某事,这可能是可行的方法,但是您需要密切关注解决方案。

【讨论】:

  • 感谢您的回答。在 try-block 中,程序打开一个文件,向其中写入一些数据,并在一段时间后将其删除。
  • @aminakoy 我没有看到任何其他解决您的问题的方法。在另一个问题中将您的代码发布到您执行文件操作的位置怎么样,也许我们可以帮助您创建程序,这样它就不会引发 MemoryException?
【解决方案2】:

请注意,Python 只有在事先意识到它会过度使用内存时才会抛出 MemoryError。如果它是偶然发生的(或被 Python “忽视”),那么你就不走运了。 documentation 已经提到了这一点:

内存错误

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

因此,如果没有什么可以挽救或解释器无法恢复,则没有MemoryError


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

【讨论】:

  • try-block 中的代码,打开一个文件,向其中写入一些内容并删除它。这发生在一个无休止的while循环中。
  • 和?这如何产生 MemoryError?什么东西?为什么要删除文件?你关闭文件句柄吗?
  • 那只回答了部分问题。也许你可以edit你的问题来展示更多你的实际代码?
  • 感谢您的回答。我注意到 python 在抛出 MemoryError 时非常不一致。有时它会抛出和错误,而很多时候它不会。
【解决方案3】:

您提出了一个非常模棱两可的问题,因为您没有绘制充满记忆的场景。

内存满了怎么办?你清空它!好的做法是您必须知道脚本消耗了多少内存。

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

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

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

【讨论】:

  • 场景如下:程序打开文件,写入一些数据,然后删除。
  • @aminakoy 为什么打开文件后要删除它?无论如何,我的回答仍然应该正确看待事情。
  • 它不会删除所有文件。只有满足特定条件的文件。
猜你喜欢
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
相关资源
最近更新 更多