首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么时候用Python捕捉MemoryError?

什么时候用Python捕捉MemoryError?
EN

Stack Overflow用户
提问于 2014-03-30 01:19:45
回答 2查看 4.2K关注 0票数 12

我试图理解何时用Python捕获MemoryError是有意义的,我有两个场景:

场景1:成功捕获MemoryError。

代码语言:javascript
复制
import numpy as np

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

场景2:我的程序冻结了

代码语言:javascript
复制
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')

我的猜测是,在第一种情况下,python“知道”需要分配多少内存,从而引发MemoryError异常。在第二种情况下,python并不“知道”我打算让silly变得多大。但是,list是一个动态阵列;因此,python应该知道将这个数组扩展一定数量会导致MemoryError,那么为什么不引发异常呢?

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

异常MemoryError 当操作内存耗尽时引发,但情况可能仍然会被拯救(通过删除某些对象)。关联的值是一个字符串,指示哪种(内部)操作耗尽了内存。请注意,由于底层内存管理体系结构(C的malloc()函数),解释器可能并不总是能够从这种情况下完全恢复;不过,它会引发异常,以便可以打印堆栈跟踪,以防导致运行程序。

虽然这对我有所帮助,但我仍然不太清楚到底发生了什么,而且我也没有得到像文档所指出的那样的例外。

我的问题:我对场景1的猜测正确吗?为什么在场景2中没有引发MemoryException

我正在使用Python13.10,我使用的是ubuntu13.10

EN

回答 2

Stack Overflow用户

发布于 2014-03-31 06:53:46

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

只有当您的RAM (main memory)被使用到它的最大级别时,这个场景才会出现,大多数OS通过将较低优先级的数据转移到Hard Disk来处理这个场景,因此在新操作系统中没有MemoryError,但是处理这个问题更好,因为legacy OS没有上述机制,因此编程人员需要处理它。

票数 1
EN

Stack Overflow用户

发布于 2014-04-01 13:52:20

MemoryError是由OS引发的,而不是由Python引发的。

当发现内存已满时,Legacy OS会立即提高MemoryError,当最新的OS大多数试图将内容移动到硬盘时,发现主存E 213已满,并且没有新请求的空间,如果它仍然不能在E 114分配的硬盘E 215E 116当前请求大小E 217中超过分配给此特定进程的数据存储空间的限制,则会引起E 118(主存)E 219。

您的python程序可以使用try exception.捕获OS引发的MemoryError。

当您请求内存超过存储数据的MemoryError限制时,OS也会引发Main Memory。

示例:如果您使用512 to,而您的操作系统在RAM中分配了200 to用于数据,而您的操作系统为代码分配了rest,那么操作系统将为您的进程分配200 to的数据空间,并且您将请求存储超过100 to的内存,因此在此场景中OS也会引发MemoryError。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22739153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档