我有一个简单的循环可以在一些模拟中绘制一些累加值,这需要很长时间才能计算出来。我将其简化为以下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没有响应”的通知。
仅此消息还不是问题,但是如果您只是忽略此警告并且不按 Wait ,程序将停止并显示
Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
(当您按下强制退出时,也会发生同样的事情。)
有人知道为什么会发生这种情况以及如何避免吗?
无法运行此仿真,例如一夜之间,因为您经常需要注意此警告,然后再次按等待。
答案 0 :(得分:0)
正如@CarlosGonzalez的评论中的链接问题所述,SIGKILL可能是由Linux OOM(内存不足)杀手发送的。如果是这种情况,那么唯一的解决方案是使用更少的内存,或获得更多的内存。
鉴于运行MCVE需要多长时间,我无法确定正在使用大量内存的确切源,但是我可以猜测它与counter
或yvalues
无关- -counter
的数量级最多为10 ^ 10(1000 * 10_000_000),适合64位整数罚款(8个字节的内存),而yvalues
可以容纳1000个整数那些也很好(如果我们假设它是一个数组,并且使用counter
是64位int,则使用8kB)。
在以下代码中,我注意到fig.canvas.flush_events()
与其余代码相比运行得很慢(尝试将其注释掉并比较速度,并注意Ctrl-C / 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?
也许您可能需要重新考虑刷新画布事件的需要。