我试图理解何时用Python捕获MemoryError是有意义的,我有两个场景:
场景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场景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')我的猜测是,在第一种情况下,python“知道”需要分配多少内存,从而引发MemoryError异常。在第二种情况下,python并不“知道”我打算让silly变得多大。但是,list是一个动态阵列;因此,python应该知道将这个数组扩展一定数量会导致MemoryError,那么为什么不引发异常呢?
我看过这问题,文档中的相关段落是:
异常MemoryError 当操作内存耗尽时引发,但情况可能仍然会被拯救(通过删除某些对象)。关联的值是一个字符串,指示哪种(内部)操作耗尽了内存。请注意,由于底层内存管理体系结构(C的malloc()函数),解释器可能并不总是能够从这种情况下完全恢复;不过,它会引发异常,以便可以打印堆栈跟踪,以防导致运行程序。
虽然这对我有所帮助,但我仍然不太清楚到底发生了什么,而且我也没有得到像文档所指出的那样的例外。
我的问题:我对场景1的猜测正确吗?为什么在场景2中没有引发MemoryException?
我正在使用Python13.10,我使用的是ubuntu13.10
发布于 2014-03-31 06:53:46
在Python中,是一个链接列表,因此只有当系统无法分配额外的内存时,才会引发内存异常MemoryError。
只有当您的RAM (main memory)被使用到它的最大级别时,这个场景才会出现,大多数OS通过将较低优先级的数据转移到Hard Disk来处理这个场景,因此在新操作系统中没有MemoryError,但是处理这个问题更好,因为legacy OS没有上述机制,因此编程人员需要处理它。
发布于 2014-04-01 13:52:20
MemoryError是由OS引发的,而不是由Python引发的。
当发现内存已满时,Legacy OS会立即提高MemoryError,当最新的OS大多数试图将内容移动到硬盘时,发现主存
E 213已满,并且没有新请求的空间,如果它仍然不能在E 114分配的硬盘E 215或E 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。
https://stackoverflow.com/questions/22739153
复制相似问题