我有一段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);
之后再次运行吗?
答案 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
,并且没有编程方式,那么你的程序用户的系统不会满足使用你的程序的要求,并且因内存错误而崩溃是可以的!