繁体   English   中英

循环浏览大量文件并保存数据图的最快/最有效方法是什么?

[英]What is the fastest/most efficient way to loop through a large collection of files and save a plot of the data?

因此,我有一个程序,该程序循环遍历约2000多个数据文件,执行傅立叶变换,绘制变换,然后保存图形。 感觉程序运行时间越长,获得的速度就越慢。 是否可以通过以下代码的简单更改使它运行得更快或更干净?

以前,我将傅里叶变换定义为一个函数,但是我在这里读到某处python具有较高的调用函数开销,因此我取消了该函数,并且一直在直接运行。 另外,我读到clf()拥有以前数据的稳定记录,如果您循环浏览许多图,它们可能会变得很大并减慢该过程,因此我将其更改为close() 这些好的变化在哪里?

from numpy import *
from pylab import *

for filename in filelist:

    t,f = loadtxt(filename, unpack=True)

    dt = t[1]-t[0]
    fou = absolute(fft.fft(f))
    frq = absolute(fft.fftfreq(len(t),dt))

    ymax = median(fou)*30

    figure(figsize=(15,7))
    plot(frq,fou,'k')

    xlim(0,400)
    ylim(0,ymax)

    iname = filename.replace('.dat','.png')
    savefig(iname,dpi=80)
    close()

您是否考虑过使用multiprocessing模块来并行处理文件? 假设您实际上在这里受CPU限制(这意味着傅立叶转换占用了大部分运行时间,而不是读写文件),这应该可以加快执行时间,而实际上并不需要加快循环本身。

编辑:

例如,如下所示(未经测试,但应该可以给您带来灵感):

def do_transformation(filename)
    t,f = loadtxt(filename, unpack=True)

    dt = t[1]-t[0]
    fou = absolute(fft.fft(f))
    frq = absolute(fft.fftfreq(len(t),dt))

    ymax = median(fou)*30

    figure(figsize=(15,7))
    plot(frq,fou,'k')

    xlim(0,400)
    ylim(0,ymax)

    iname = filename.replace('.dat','.png')
    savefig(iname,dpi=80)
    close()

pool = multiprocessing.Pool(multiprocessing.cpu_count())
for filename in filelist:
    pool.apply_async(do_transformation, (filename,))
pool.close()
pool.join()

您可能需要调整工作进程中实际完成的工作。 例如,尝试并行化磁盘I / O部分可能对您没有多大帮助(甚至伤害您)。

是的,增加收盘价是不错的选择。 它应该有助于解决您的内存泄漏问题。 我还建议将图形,绘图和关闭命令移出循环-只需更新由plot创建的Line2D实例即可。 查看以获取更多信息。

注意:我认为这应该可行,但是我还没有在这里进行测试。

我测试了与您在ipython中所做的类似的事情,并且我注意到当目录中包含很多文件时,循环变得相当慢。 该目录中的文件系统似乎具有与该文件夹中的文件数有关的开销,可能与以下内容的查找时间有关:

loadtxt(filename, unpack = true)

您可以尝试通过将文件列表分成较小的块,然后将每个块保存在不同的目录中,在将图保存为块的位置进行拆分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM