多进程拆分文件 - 总是受IO限制吗?

2 投票
1 回答
1125 浏览
提问于 2025-04-21 00:50

我在看一个类似的讨论,发帖人想用多进程来处理每一行内容(可以在这里找到)。这个问题的一个有趣的回答是:

from multiprocessing import Pool

def process_line(line):
    return "FOO: %s" % line

if __name__ == "__main__":
    pool = Pool(4)
    with open('file.txt') as source_file:
        # chunk the work into batches of 4 lines at a time
        results = pool.map(process_line, source_file, 4)

我在想,如果你能做到这一点,但不是返回每一行的处理结果,而是把它写入另一个文件。

基本上,我想看看有没有办法用多进程来读取和写入文件,以便按行分割文件。比如说,我想每个文件有10万行。

from multiprocessing import Pool

def write_lines(line):
    #need method to write lines to multiple files, perhaps a Queue?

if __name__ == "__main__":
    #all my procs
    pool = Pool()
    with open('file.txt') as source_file:
        # chunk the work into batches of 4 lines at a time
        results = pool.map(process_line, source_file, 100000)

我可以使用一个多进程队列,把文件分成几个队列对象,然后让每个处理器负责写出所有的行,但我还是得先读取文件。所以,这样做会不会总是完全受输入输出的限制,永远无法高效地使用多进程呢?

1 个回答

2

正如你所猜测的,这项工作其实并不会从 multiprocessing 中获得太多好处(甚至没有)。你在做的就是读取一个文件,然后把这个文件的内容写入其他文件。这完全是受限于输入输出的操作;瓶颈在于读取和写入磁盘的速度。如果你试图用 multiprocessing 同时写多个文件到同一个磁盘,这并不会让写入速度变快,因为磁盘一次只能写一个东西。

multiprocessing 能发挥作用的地方是当你有一些需要大量计算的工作可以并行处理,但这并不是你现在要做的事情。如果你想从一个文件中读取行,对每一行进行一些比较复杂的处理,然后再写入另一个文件,multiprocessing 会有帮助,但听起来你在写每一行之前并不需要进行任何处理。

撰写回答