我包装了一些可能会用try / except块耗尽内存的代码。但是,尽管会生成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_weights行self.syn0恰好是我期望引发异常的行(它分配了一个大数组)。令人费解的是,我无法捕获内存错误,无法执行使数组大小变小的操作。
reset_weights
self.syn0
是否有特殊情况导致MemoryError无法被抓住?
MemoryError
注意,由于底层的内存管理体系结构(C的malloc()函数),解释器可能无法始终完全从这种情况中恢复; 尽管如此,它还是引发了一个异常,以便在程序失控的情况下可以打印堆栈回溯。
(请参阅文档)
通常,您仍然可以捕获MemoryErrors。我不知道引发MemoryError时到底发生了什么,我想当粪便真的击中了风扇并且那里没有更多的内存可以处理时,您可能无法捕获它。
另外,由于您可能无法真正从中恢复(请参阅上文),因此捕获它可能没有太大意义。 您应该通过避免 例如仅允许列表的大小限制来 避免耗尽内存 并限制程序使用的内存量。