何时在Python中捕获MemoryError?

Aka*_*all 11 python memory-management

我试图了解何时捕获MemoryErrorPython 有意义,我有两个场景:

场景1:成功捕获MemoryError.

import numpy as np

try:
    a = np.ones(100000000000)
except MemoryError:
    print 'got memory error, plan B'
    a = np.ones(10) # this gets created
Run Code Online (Sandbox Code Playgroud)

场景2:我的程序冻结了

silly = []
c = 0
try:
    while True:
        silly.append((str(c))) # just increasing the list
        c += 1
        if c % 1000000 == 0:
            print 'counter : {}'.format(c)
except MemoryError:
    print 'oops' # never get here
    silly.append('silly')
Run Code Online (Sandbox Code Playgroud)

我的猜测是在第一种情况下,python"知道"需要分配多少内存,从而引发MemoryError异常.虽然在第二种情况下,python并不"知道"我有多大意图silly.但是,list是一个动态数组 ; 因此,python应该知道将这个数组扩展一定量会导致a MemoryError,为什么异常没有提出呢?

我看过这个问题,文档中的相关段落是:

异常MemoryError

当操作耗尽内存时引发但情况仍可能被挽救(通过删除一些对象).关联值是一个字符串,表示内存中耗尽了哪种(内部)操作.请注意,由于底层内存管理体系结构(C的malloc()函数),解释器可能无法始终从这种情况中完全恢复; 然而,它会引发异常,以便可以打印堆栈回溯,以防出现失控程序.

虽然这对我很有帮助,但我仍然不清楚发生了什么,而且我没有像文档似乎表明的那样得到例外.

我的问题:我对方案1的猜测是否正确?为什么MemoryException不在方案2中提出?

我使用的是Python 2.7.5+,我在ubuntu 13.10上

Mr.*_*. A 1

MemoryError在Python中,列表是一个链表,因此只有当系统无法分配额外的内存时才会引发内存异常。

仅当您的RAM (main memory)利用率达到最高水平时,才会发生这种情况,大多数操作系统通过移动优先级较低的数据来处理这种情况,因此Hard Disk您不会MemoryError进入新操作系统,但最好处理这种情况,因为legacy OS没有上述机制所以程序员需要处理它。

  • Python列表当然是一个动态数组:https://docs.python.org/2/faq/design.html#how-are-lists-implemented (4认同)