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

如何处理;MemoryError“;在Python代码中,python,exception-handling,Python,Exception Handling,我有一段python代码,它会在一段时间后生成一个MemoryError。我知道它会消耗很多内存。 因此,我决定将代码放在try/except块中,以便骨架如下所示: while True: while True: try: #---- do some stuff except MemoryError as err: print(err)

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

while True:

      while True:

            try:
            #---- do some stuff

            except MemoryError as err:
                   print(err)
                   break
因此,我的想法是,如果出现
内存错误,则中断第一个
while
-循环,因为我有一个外部
while
-循环,它将再次启动程序

目前看来它似乎有效,但我不确定。过了一会儿,它又停止了,我需要重新启动程序。
有人知道更好的解决方案吗,这样程序就可以再次运行
内存错误了?

请注意,Python只有在意识到它事先会过度使用内存时才会抛出
内存错误。如果它是偶然发生的(或者Python没有注意到),那么您就不走运了。政府已经提到这一点:

记忆者

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

因此,如果没有什么可挽救的,或者如果解释器无法恢复,那么就没有
内存错误



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

您提出的问题非常模糊,因为您没有绘制填满内存的场景

当内存满时,你会做什么?你把它倒空!好的做法是,您必须知道脚本消耗了多少内存

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

  • 如果您可以清空一些列表/数组并继续执行,那么就这样做吧

  • 如果您认为您的程序将消耗如此多的内存,那么如果出现
    内存错误
    ,并且没有可编程的解决方法,那么您的程序用户的系统就不符合使用您的程序的要求,并且由于内存错误而崩溃是可以的


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

      首先,关于继续尝试除块。恐怕你不能这样做

      所以简短的回答是:您不能返回到发生异常的try块,您可以转到try的第一行

      你能做的事:

      我通常像下面这样处理我的异常。创建
      while True
      循环,如下所示:

      while True:
          try:
              #some code here
          except SomeException:
              continue
      
      现在,您可以
      继续
      在发生异常后重试

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

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

      然而,这是非常危险的,但是如果你的记忆被超出了不多的次数(为了清楚起见,您会问发生
      MemoryError
      时该怎么办?是的。或者更好:在MemoryError发生后如何继续尝试块?可能相关:您使用的是什么类型的数据结构?只是标准列表和字典,或者您使用的是第三方软件包,如
      numpy
      pandas
      .Memory er当试图创建和使用非常大的
      numpy
      数组时,ror会定期出现。在另一篇文章中,你说你正在学习Python。初学者不应该出现内存错误,除非他们做了一些非常错误的事情。不要试图
      除了
      ,排除错误。弄清楚是什么在不可控地使用内存。场景io是这样的:程序打开文件,向其中写入一些数据,然后删除它。@aminakoy为什么要在打开文件后删除它?无论如何,我的答案应该是正确的。它不会删除所有文件。只删除符合特定条件的文件。try块中的代码打开一个文件,向其中写入一些内容(&D)删除它。这是在一个无休止的while-loop中发生的。还有?这是如何创建内存错误的?什么东西?为什么要删除文件?是否关闭文件句柄?这只回答了部分问题。也许你可以让你的问题显示更多的实际代码?谢谢这个答案。我注意到python在抛出Mem时非常不一致oryError。有时它会抛出和出错,而很多时候它不会。谢谢你的回答。在“尝试”块中,程序打开一个文件,向其中写入一些数据,然后在一段时间后将其删除。@aminakoy我看不到任何其他解决您问题的方法。在另一个问题中执行文件操作的地方发布代码怎么样,也许我们可以这样做帮助您创建程序,使其不会引发MemoryException?