我有一个文件列表(有时只有一个),我想用滑动窗口并行处理每个文件的每n行。 我不想通过文件使用多处理,因为在某些情况下,文件的数量可能少于可用内核的数量。
接下来,我想将每个滑动窗口的输出存储在一个列表中(用于随机值)。到目前为止,我已经做到了,并且工作正常,但是有问题。
如果我可以更改pool.map
并使用pool.something_else
来允许我的函数使用多个参数(文件,滑动窗口大小和j),那就太好了。
我尝试使用pool.apply_async
,但是当我执行pool.join
时,它花费的时间太长,我想这可能是错误的。下一步,我想通过使用滑动窗口all_segments
遍历所有文件来比较输出值(均值和标准差)。
简短说明:
对于文件中的每个滑动窗口,计算平均值并针对先前获得的平均值和标准偏差计算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)