多个文件,多处理和滑动窗口

时间:2018-07-13 06:25:22

标签: python

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

接下来,我想将每个滑动窗口的输出存储在一个列表中(用于随机值)。到目前为止,我已经做到了,并且工作正常,但是有问题。

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

我尝试使用pool.apply_async,但是当我执行pool.join时,它花费的时间太长,我想这可能是错误的。下一步,我想通过使用滑动窗口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)
    

0 个答案:

没有答案