使用PyCharm避免SIGKILL

时间:2019-03-01 10:55:37

标签: python-3.x matplotlib pycharm ubuntu-18.04

我有一个简单的循环可以在一些模拟中绘制一些累加值,这需要很长时间才能计算出来。我将其简化为以下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)

(当您按下强制退出时,也会发生同样的事情。)

有人知道为什么会发生这种情况以及如何避免吗?

无法运行此仿真,例如一夜之间,因为您经常需要注意此警告,然后再次按等待

1 个答案:

答案 0 :(得分:0)

正如@CarlosGonzalez的评论中的链接问题所述,SIGKILL可能是由Linux OOM(内存不足)杀手发送的。如果是这种情况,那么唯一的解决方案是使用更少的内存,或获得更多的内存。

鉴于运行MCVE需要多长时间,我无法确定正在使用大量内存的确切源,但是我可以猜测它与counteryvalues无关- -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?

也许您可能需要重新考虑刷新画布事件的需要。