Python 进程增加内存 RAM 使用
Python process increasing memory RAM usage
我已经使用python几个月了,这个问题是两三天前才出现的。
此刻我在 IDLE 3.4.3 python GUI 中 运行 这段代码:
x = [1,2,3,4,5]
for i in x:
x.append((i * (i + 1))/2)
print(x)
但这没有输出或错误(不是唯一的),控制台只是打开并等待(如思考)
然后我检查任务管理中的进程,我看到进程以 30-35 mb 开始
一两分钟后,该过程正在消耗:
我还没有用 OS 安装新软件或其他东西,这发生在两台不同的笔记本电脑(W7 和 W10)上,我知道可能是这段代码(如果我创建一个新的空列表,它就可以工作) 但其他简单指令如 1+1 呢
我尝试过不同的 IDE 和 python 版本,包括体系结构。
首先我使用 iPython notebook 和 Spyder,因为我需要绘图,Anaconda 已经准备好了一切,但内核总是说 Busy 并且没有输出;我重新启动、中断、新内核但不起作用,这发生在本周,因为我工作得很好所以我不得不删除它,因为这种情况正在发生。
有人知道发生了什么事吗?
为了看看发生了什么,让我稍微修改一下你的代码
x = [1,2,3,4,5]
for i in x:
x.append((i * (i + 1))/2)
print(x)
if len(x) > 20:
break
print(x)
输出看起来像这样
[1, 2, 3, 4, 5, 1.0]
[1, 2, 3, 4, 5, 1.0, 3.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0, 7260.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0, 7260.0, 1.0]
append
只是将一个新值添加到列表的末尾,所以您所做的是创建一个无限循环,其中 x
只会变得越来越大。基本上每次迭代器从 x
中抽取一个数字时,都会将一个新数字添加到 x
的末尾,因此迭代器在完成之前总会有 5 个数字要抽取。
随着迭代器保持运行,x
不断变得越来越大,消耗越来越多的内存。
要修复此无限循环,您可以将结果存储在不同的列表中,或者如果您确实希望将结果附加到 x
,则可以使用我上面使用的 break
条件。此外,如果您打算替换 x
中的值,您可以这样做
x = [1,2,3,4,5]
for i, v in enumerate(x):
x[i] = (v * (v + 1))/2
print(x)
输出
[1.0, 3.0, 6.0, 10.0, 15.0]
希望对您有所帮助。
我已经使用python几个月了,这个问题是两三天前才出现的。 此刻我在 IDLE 3.4.3 python GUI 中 运行 这段代码:
x = [1,2,3,4,5]
for i in x:
x.append((i * (i + 1))/2)
print(x)
但这没有输出或错误(不是唯一的),控制台只是打开并等待(如思考) 然后我检查任务管理中的进程,我看到进程以 30-35 mb 开始 一两分钟后,该过程正在消耗:
我还没有用 OS 安装新软件或其他东西,这发生在两台不同的笔记本电脑(W7 和 W10)上,我知道可能是这段代码(如果我创建一个新的空列表,它就可以工作) 但其他简单指令如 1+1 呢 我尝试过不同的 IDE 和 python 版本,包括体系结构。 首先我使用 iPython notebook 和 Spyder,因为我需要绘图,Anaconda 已经准备好了一切,但内核总是说 Busy 并且没有输出;我重新启动、中断、新内核但不起作用,这发生在本周,因为我工作得很好所以我不得不删除它,因为这种情况正在发生。
有人知道发生了什么事吗?
为了看看发生了什么,让我稍微修改一下你的代码
x = [1,2,3,4,5]
for i in x:
x.append((i * (i + 1))/2)
print(x)
if len(x) > 20:
break
print(x)
输出看起来像这样
[1, 2, 3, 4, 5, 1.0]
[1, 2, 3, 4, 5, 1.0, 3.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0, 7260.0]
[1, 2, 3, 4, 5, 1.0, 3.0, 6.0, 10.0, 15.0, 1.0, 6.0, 21.0, 55.0, 120.0, 1.0, 21.0, 231.0, 1540.0, 7260.0, 1.0]
append
只是将一个新值添加到列表的末尾,所以您所做的是创建一个无限循环,其中 x
只会变得越来越大。基本上每次迭代器从 x
中抽取一个数字时,都会将一个新数字添加到 x
的末尾,因此迭代器在完成之前总会有 5 个数字要抽取。
随着迭代器保持运行,x
不断变得越来越大,消耗越来越多的内存。
要修复此无限循环,您可以将结果存储在不同的列表中,或者如果您确实希望将结果附加到 x
,则可以使用我上面使用的 break
条件。此外,如果您打算替换 x
中的值,您可以这样做
x = [1,2,3,4,5]
for i, v in enumerate(x):
x[i] = (v * (v + 1))/2
print(x)
输出
[1.0, 3.0, 6.0, 10.0, 15.0]
希望对您有所帮助。