Aka*_*all 11 python memory-management
我试图了解何时捕获MemoryError
Python 有意义,我有两个场景:
场景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上
MemoryError
在Python中,列表是一个链表,因此只有当系统无法分配额外的内存时才会引发内存异常。
仅当您的RAM (main memory)
利用率达到最高水平时,才会发生这种情况,大多数操作系统通过移动优先级较低的数据来处理这种情况,因此Hard Disk
您不会MemoryError
进入新操作系统,但最好处理这种情况,因为legacy OS
没有上述机制所以程序员需要处理它。
归档时间: |
|
查看次数: |
3053 次 |
最近记录: |