【问题标题】:Python - multiprocessingPython - 多处理
【发布时间】:2019-10-15 12:02:58
【问题描述】:

我要完成以下任务:

我有一个“输入”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()

但是执行时间没有区别,我认为没有发生多进程。是否有任何错误或更好的方法来解决此问题以最小化执行时间?

【问题讨论】:

    标签: python multiprocessing


    【解决方案1】:

    apply(func[, args[, kwds]]) 函数的docs 表示

    它会阻塞直到结果准备好。鉴于此块,apply_async() 更适合并行执行工作。此外, func 仅 在池中的一名工作人员中执行。

    这意味着您处理输入文件的行顺序阻塞池,直到池工作人员之一产生结果。第二件事是,我认为尝试在池工作人员之间拆分输入文件的不同行的处理不会显着加快速度。我会告诉你更多,我认为你会花更多的时间在进程之间来回传输数据而不是实际节省处理本身的时间,因为在你的情况下它不是长时间运行工作。

    也许值得尝试并行处理多个输入文件,但考虑到它们通常存储在同一个 HDD 上的事实也won't give you any speed up

    顺便说一句如果你觉得这很有用,这里是如何在一行中使用 bashawk 进行处理:

    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
    

    使用这种方法,您可以在终端中启动一堆作业,看看它是否会加快多个文件的处理速度。

    【讨论】:

    • bash 工作正常!我可能会对其进行系统调用。
    猜你喜欢
    • 2011-04-20
    • 2016-05-30
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多