我有一个简单的循环,在一些模拟中绘制一些累加值,这需要很长时间来计算。我把它简化为下面的MCVE:
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
counter = 0
yvalues = [0]
for k in range(1000):
for l in range(10_000_000):
counter += 1 + np.tanh(counter)
print(k, l, counter)
yvalues.append(counter)
plt.plot(yvalues)
plt.draw()
fig.canvas.flush_events()问题是,过了一段时间后,我收到了一个通知:"PyCharm没有响应“,尽管程序仍然在运行,运行得很好。

消息本身并不是问题所在,但是如果您忽略了这个警告并且不按等待,程序就会停止并显示。
Process finished with exit code 137 (interrupted by signal 9: SIGKILL)(当你按原力退出时,也会发生同样的情况。)
,有人知道为什么会发生这种事吗?如何避免?
这使得不可能运行这一模拟,例如,一夜之间,因为你必须不断地注意这一警告,并按下再次等待。
发布于 2020-03-27 07:22:05
正如@CarlosGonzalez的评论中所提到的,SIGKILL可能是由Linux (内存不足)杀手发送的。如果是这样的话,那么唯一的解决方案就是使用更少的内存,或者获得更多的内存。
考虑到运行MCVE所需的时间,我无法确定使用这么多内存的确切源,但我可以猜测它与counter或yvalues无关-- counter最多可达10^10 (1000 * 10_000_000)的数量级,适合64位整数精细(8字节内存),yvalues也可以容纳其中1000位(如果我们假设它是数组,而counter是64位int)。
使用下面的代码,我注意到与其余代码相比,fig.canvas.flush_events()运行得相当慢(试着注释掉它并比较速度,并注意Ctrl/SIGINT如何无法阻止它):
import matplotlib.pyplot as plt
fig = plt.figure()
counter = 0
yvalues = [0]
for k in range(1000):
counter += 1e7
yvalues.append(counter)
plt.plot(yvalues)
plt.draw()
print(k)
fig.canvas.flush_events() # Potentially problematic?也许您需要重新考虑是否需要刷新画布事件。
https://stackoverflow.com/questions/54943192
复制相似问题