多文件、多处理和滑动风

2024-04-23 23:24:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件列表(有时只有一个),我想用滑动窗口并行处理每个文件中的每n行。 我不想通过文件使用多处理,因为在某些情况下,可用的文件可能少于内核。你知道吗

接下来,我要将每个滑动窗口的输出存储在一个列表中(对于随机值)。我已经做到了这一点,到目前为止,它的工作很好,但也有问题。你知道吗

如果我可以更改pool.map并使用pool.something_else来为我的函数提供多个参数(文件、滑动窗口大小和j),那就太好了。你知道吗

我试过用pool.apply_async但是当我用pool.join的时候,它花费了太长的时间,我猜是出了问题。下一步我想通过使用滑动窗口遍历所有文件来比较输出值(mean和std):all_segments。你知道吗

简而言之:

  • 对于10个随机值,使用选定的窗口遍历文件
  • 计算窗口的平均值并将输出存储到列表中。对于列表计算,平均值和标准偏差的平均值。你知道吗
  • 对于文件中的每个滑动窗口,计算平均值,并根据之前获得的平均值和标准偏差计算z分数。你知道吗

    def random_segments(j):
                    cov_list=[]
                    cov = []
                    lines = list(islice(f, j, j+1000))
                    for line in lines:
                            cov.append(float(line.split("\t")[2]))
    
                    mc1 = sum(cov)/len(cov)
                    cov_list.append(mc1)
                    return cov_list
    
    def all_segments(j):
            cov_list=[]
            cov = []
            lines = list(islice(f, j, j+1000))
            for line in lines:
                    cov.append(float(line.split("\t")[2]))
            mc2 = sum(cov)/len(cov)
            z = (mc2 - mean) / sd
            print (z)
            if z > 10 or z < -10:
                    print (line)
    
    
    
            if __name__ == '__main__':
            for cv_file in os.listdir("."):
    
                     if cv_file.endswith(".coverage.out"):
                             f = open(cv_file, 'r').readlines()
                             if args.ws == False:
                                     args.ws = 1000
                             size = len(f)
                             print (cv_file + "\t" + str(size))
                             perc= float(args.rn)/100 * int(size)
                             perc = perc // 1
                             print(perc)
                             pool=mp.Pool(int(args.proc))
                             rn=[random.randint(1,int(size)-args.ws) for _ in range(10)]
                             data = pool.map(random_segments, [i for i in rn])
                             data = [ent for sublist in data for ent in sublist]
                             sd, variance, mean = mean_std(data)
    

Tags: 文件in列表foriflineargsmean