我要完成以下任务:
我有一个“输入” tsv文件:
0 2 0
2 5 1
5 10 2
10 14 5
我想将其转换为以下格式:
0
0
1
1
1
2
2
2
2
2
5
5
5
5
我设法使用以下代码做到这一点:(开始是输入文件的第一列,停止是第二列,深度是第三列。)
def parse(i):
out = []
start = int(i[0])
stop = int(i[1])
depth = i[2]
times = stop - start
out += times * [depth]
return(out)
signal = []
for i in tqdm(file):
x = parse(i)
signal.append(x)
with open('output.txt', 'w') as f:
for item in signal[0]:
f.write("%s\n" % item)
尽管我的输入文件有16720973行,而且我有许多行,所以我尝试使用以下代码进行并行处理以最大程度地减少执行时间:
def parse(start, stop, depth):
out = []
times = int(stop) - int(start)
out += times * [depth]
return(out)
signal = []
poolv = multip.Pool(20)
x = [poolv.apply(parse, args=(i[0], i[1], i[2])) for i in tqdm(file)]
signal.append(x)
poolv.close()
但是执行时间没有区别,我认为没有发生多进程。为了减少执行时间,是否有任何错误或更好的方法来解决此问题?
该文档的应用(FUNC [,ARGS [,kwds]])函数是在说
它会阻塞直到结果准备就绪。给定此块,apply_async()更适合于并行执行工作。此外,func仅在池的工作程序之一中执行。
这意味着您将依次处理输入文件的各行,以阻塞池,直到其中一个池工作程序产生结果为止。第二件事是,我认为尝试在池工作程序之间拆分输入文件的不同行的处理不会显着提高速度。我会告诉您更多信息,我认为您将花费更多的时间在进程之间来回传输数据,而不是实际节省处理时间,因为这不是一个长时间运行的过程,因此会稍微降低整个过程的速度。工作。
可能值得尝试并行处理多个输入文件,但是考虑到它们通常存储在同一HDD上的事实,这也不会给您带来任何提速。
顺便说一句,如果您觉得这很有用,请按照以下步骤使用bash
和进行处理awk
:
while read line; do echo $line | awk '{for(i = 0; i < $2 - $1; i++) print $3}'; done < input.txt > output.txt
这是您的input.txt
:
0 2 0
2 5 1
5 10 2
10 14 5
这就是您在output.txt
文件中得到的:
0
0
1
1
1
2
2
2
2
2
5
5
5
5
使用这种方法,您可以在终端中启动一堆作业,并查看它是否可以加快处理多个文件的速度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句