Python无法捕获内存错误

Python无法捕获内存错误,python,exception-handling,out-of-memory,Python,Exception Handling,Out Of Memory,我用try/except块包装了一些可能耗尽内存的代码。但是,尽管生成了MemoryError,但不会捕获它 我有以下代码: while True: try: self.create_indexed_vocab( vocab ) self.reset_weights() break; except MemoryError: # Stuff to reduce s

我用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
文件“/make_model_taged_wmt11.py”,第39行,中
模型。构建词汇(句子)
文件“/root/CustomCompiledSoftware/gensim/gensim/models/word2vec.py”,第236行,内置
self.reset_权重()
文件“/root/CustomCompiledSoftware/gensim/gensim/models/word2vec.py”,第347行,重设权重
self.syn0+=(random.rand(len(self.vocab),self.layer1\u大小)-0.5)/self.layer1\u大小
文件“mtrand.pyx”,第1044行,在mtrand.RandomState.rand(numpy/random/mtrand/mtrand.c:6523)中
文件“mtrand.pyx”,第760行,在mtrand.RandomState.random_sample(numpy/random/mtrand/mtrand.c:5713)中
文件“mtrand.pyx”,第137行,在mtrand.cont0_数组中(numpy/random/mtrand/mtrand.c:1300)
记忆者
我正在Ubuntu 12.04下运行Python 2.7.3

reset\u weights
line
self.syn0
正是我希望引发异常的那一行(它分配了一个大数组)。令人费解的是,我无法捕捉内存错误并执行一些将使数组大小变小的操作


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

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

(见附件)

通常情况下,你仍然可以抓住记忆错误。如果不知道当一个记忆错误被抛出时会发生什么,我猜你可能无法捕捉到它,当狗屎真的击中了风扇,没有更多的内存来处理它


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

您确定这些是引发异常的行吗?尝试将except行更改为except:并在那里打印一些内容,以确保这些行是正确的。@DannyElly似乎stacktrace显示了一个调用,以重置\u weights(),这是except之前的最后一行。我希望正在调用reset\u weights。@Eponymous是调用
create\u indexed\u vocab
中的参数
vocab
,该参数应该是
self.vocab
?而且,就@DannyElly的观点而言,可能有一个调用
reset\u weights
隐藏在a中,该调用用于创建索引的\u vocab?这在这里可能无关紧要,因为它报告了一个MemoryError…@Eponymous我仍然会更改except行并在那里打印一些东西。通常情况下,当问题出现在另一个代码块中时,我们确信自己调试了正确的代码块。这可能非常令人沮丧。当我遇到这样的错误时,我只需添加尽可能多的打印,以确保我处理的是正确的问题。@Ephonymous您确定try块中的行会引发异常吗。您是否在可疑行前后进行了打印(
self.reset_weights()
),并且只查看了打印前的内容。这是我能帮助的最好的了。我知道我在建议一些琐碎而愚蠢的建议,但我们都是人,有时我们会忽略一些显而易见的东西。祝你好运!文档中的暗示就是我写这个问题的原因。我想知道不可修补的异常是否真的发生了(在我的特定情况下是否会发生),或者我的python fu是否太低,是否缺少了语言上的细微差别。RAM是一种共享资源,因此,避免内存耗尽是不可能的。即使MS Windows上有
资源
模块,因此有一种内置的内存检查方法,另一个进程也可能在检查可用内存和分配内存之间消耗掉一些所需的内存。因此,对于希望使用尽可能多的RAM的程序,内存分配周期需要
,而(分配失败):调整需求;分配
。在Python中,我知道的检测失败分配的唯一方法是
MemoryError
。(你的答案是唯一的。)“例如,只允许一个列表有一个有限的大小”但是什么大小?使用大内存块可以加快计算速度。考虑到每台机器和每分钟的内存不同,我们如何在Python中找到正确的平衡?