我用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... )
我得到了以下的Traceback:
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
正是我预计会引发异常的地方(它分配了一个大数组)。令人困惑的是,我无法捕获内存错误并执行可以使数组大小变小的操作。
是否存在特殊情况导致无法捕获 MemoryError
?
create_indexed_vocab
函数时的参数vocab
是否应该改为self.vocab
?另外,针对@DannyElly的建议,或许在create_indexed_vocab
函数中还有一个隐含的reset_weights
函数调用?但由于此处报告了MemoryError错误,这可能并不重要... - apgself.reset_weights()
)之前和之后打印过信息,只看到了之前的打印?这是我能帮助你的最好方法。我知道我提供的建议可能很琐碎和愚蠢,但我们都是人,有时候会忽略显而易见的事情。祝你好运! - idanshmu