gpt4 book ai didi

Python 没有捕获 MemoryError

转载 作者:太空狗 更新时间:2023-10-29 17:06:39 24 4
gpt4 key购买 nike

我用 try/except block 包装了一些可能会耗尽内存的代码。但是,虽然生成了 MemoryError,但它没有被捕获。

我有以下代码:

    while True:
try:
self.create_indexed_vocab( vocab )
self.reset_weights()
break;
except MemoryError:
# Stuff to reduce size of vocabulary
self.vocab, self.index2word = None, None
self.syn0, self.syn1 = None, None

self.min_count += 1
logger.info( ...format string here... )

我得到以下回溯:

File "./make_model_tagged_wmt11.py", line 39, in <module>
model.build_vocab(sentences)
File "/root/CustomCompiledSoftware/gensim/gensim/models/word2vec.py", line 236, in build_vocab
self.reset_weights()
File "/root/CustomCompiledSoftware/gensim/gensim/models/word2vec.py", line 347, in reset_weights
self.syn0 += (random.rand(len(self.vocab), self.layer1_size) - 0.5) / self.layer1_size
File "mtrand.pyx", line 1044, in mtrand.RandomState.rand (numpy/random/mtrand/mtrand.c:6523)
File "mtrand.pyx", line 760, in mtrand.RandomState.random_sample (numpy/random/mtrand/mtrand.c:5713)
File "mtrand.pyx", line 137, in mtrand.cont0_array (numpy/random/mtrand/mtrand.c:1300)
MemoryError

我在 Ubuntu 12.04 下运行 Python 2.7.3

reset_weightsself.syn0 正是我期望引发异常的行(它分配了一个大数组)。令人费解的是,我无法捕获内存错误并执行会使数组大小更小的操作。

是否有特殊情况导致MemoryError无法被捕获?

最佳答案

请注意,由于底层内存管理架构(C 的 malloc() 函数),解释器可能并不总是能够从这种情况中完全恢复;尽管如此,它还是会引发异常,以便可以打印堆栈回溯,以防程序失控。

(参见 the docs)

通常,您仍然可以捕获 MemoryErrors。在不知道抛出 MemoryError 时到底发生了什么的情况下,我猜你可能无法在真正遇到问题并且没有更多内存来处理它时捕捉到它。

此外,由于您可能无法真正从中恢复(见上文),因此捕获它可能没有多大意义。 你真的应该避免内存不足并限制你的程序使用的内存量,例如只允许列表的大小有限。

关于Python 没有捕获 MemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19899910/

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