gpt4 book ai didi

python - 什么时候在 Python 中捕获 MemoryError?

转载 作者:太空狗 更新时间:2023-10-29 18:09:26 27 4
gpt4 key购买 nike

我试图了解什么时候在 Python 中捕获 MemoryError 有意义,我有两种情况:

场景一: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 是一个 dynamic array ;因此,python 应该知道将此数组扩展一定数量会导致 MemoryError,为什么不引发异常?

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

exception MemoryError

Raised when an operation runs out of memory but the situation may still be rescued (by deleting some objects). The associated value is a string indicating what kind of (internal) operation ran out of memory. Note that because of the underlying memory management architecture (C’s malloc() function), the interpreter may not always be able to completely recover from this situation; it nevertheless raises an exception so that a stack traceback can be printed, in case a run-away program was the cause.

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

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

我正在使用 Python 2.7.5+,我在 ubuntu 13.10 上

最佳答案

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

只有当您的 RAM(主内存) 被充分利用时,这种情况才会发生 大多数操作系统通过将优先级较低的数据移动到 硬盘 来处理这种情况,因此您在新操作系统中不会遇到 MemoryError 但最好处理此问题,因为 legacy OS 没有上述机制,因此程序员需要处理它。

关于python - 什么时候在 Python 中捕获 MemoryError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22739153/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com