Python抓不到记忆

2024-06-11 12:25:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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_weightsself.syn0正是我希望引发异常的行(它分配一个大数组)。令人费解的是,我无法捕捉内存错误,也无法执行使数组大小变小的操作。

是否存在导致MemoryError无法捕获的特殊情况?


Tags: inpyselfnonesizelinerandomfile
1条回答
网友
1楼 · 发布于 2024-06-11 12:25:12

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

(见the docs

通常,你还是可以抓住记忆者。如果不知道当一个记忆体被扔掉的时候会发生什么,我想当大便真的打到风扇上,你可能就抓不到它了,那里没有更多的记忆来处理它。

另外,由于你可能无法真正从中恢复过来(见上文),所以抓到它可能没什么意义。您应该真正避免内存不足,并限制程序使用的内存量,例如只允许列表具有有限的大小。

相关问题 更多 >