运行Python脚本时系统冻结

4

我正在编写一份多信号基线校正的代码。该代码的结构如下:

# for each file in a directory
    #read file and populate X vector
    temp = baseline_als(x,1000,0.00001)
    plt.plot(x-temp)
    plt.savefig("newbaseline.png")
    plt.close()

baseline_als函数如下。

def baseline_als(y, lam, p, niter=20):
        L = len(y)
        D = sparse.csc_matrix(np.diff(np.eye(L), 2))
        w = np.ones(L)
        for i in xrange(niter):
            W = sparse.spdiags(w, 0, L, L)
            Z = W + lam * D.dot(D.transpose())
            z = spsolve(Z, w*y)
            w = p * (y > z) + (1-p) * (y < z)
        return z

现在当我把大约100个文件放在一个目录中时,代码能正常运行,虽然需要一些时间,因为复杂度相当高。但是当我有大约10000个文件在我的目录中,然后运行这个脚本,几分钟后系统就会冻结。我不介意执行的延迟,但有没有办法让脚本完成执行呢?


你在代码"卡死"时运行过任何类型的系统监视器吗? - cdarke
我不确定如何运行系统监视器。因为鼠标和键盘变得无响应,我不得不重新启动。 - Riken Shah
1
你没有说你使用哪个操作系统。在启动程序之前启动监视器。如果你必须重新启动,那么可能会发生其他情况。你展示了整个代码吗? - cdarke
我正在使用Ubuntu 14.04。是的,整个代码除了文件读取部分。好的,我现在会尝试在执行之前启动系统监视器。 - Riken Shah
单核处理器?不行!没有线程?不行!你的处理器还活着吗? - dsgdfg
2个回答

1
我能够通过使用time.sleep(0.02)来防止我的CPU达到100%并且导致冻结。虽然需要一些时间,但仍能完成执行。
请注意,在使用此方法之前需要import time

1

当您在大量文件上运行脚本时,脚本会消耗太多RAM,请参见为什么一个简单的Python脚本会导致系统崩溃

您的程序运行的过程中,会将用于计算的数组和变量存储在进程内存(即RAM)中,并且它们会不断累积。

一个可能的解决方法是在子进程中运行baseline_als()函数。当子进程返回时,内存会自动释放,请参见Python中的内存释放

在子进程中执行函数:

from multiprocessing import Process, Queue

def my_function(q, x):
 q.put(x + 100)

if __name__ == '__main__':
 queue = Queue()
 p = Process(target=my_function, args=(queue, 1))
 p.start()
 p.join() # this blocks until the process terminates
 result = queue.get()
 print result

复制自: 在不使用线程或编写单独的文件/脚本的情况下在子进程中运行函数是否可能

这样可以防止您的进程(程序)产生未引用的旧变量而消耗内存

另一种可能性是调用垃圾收集器gc.collect(),但这并不推荐(在某些情况下无法正常工作)

更多有用的链接:

内存使用情况,如何释放内存

Python大变量RAM使用情况

我需要通过将Python字典存储在硬盘上而不是RAM中来释放RAM。这可能吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接