我想完成以下任务:
我有一个"输入"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
我设法使用以下代码执行此操作: (Start 是输入文件的第一列,stop 是第二列,深度是第三列。
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("%sn" % 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()
但是执行时间没有区别,我认为没有发生多过程。是否有任何错误或更好的方法来解决此问题以最大程度地减少执行时间?
apply(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
使用这种方法,您可以在终端中启动一堆作业,看看它是否会加快多个文件的处理速度。