多进程拆分文件 - 总是受IO限制吗?
我在看一个类似的讨论,发帖人想用多进程来处理每一行内容(可以在这里找到)。这个问题的一个有趣的回答是:
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
会有帮助,但听起来你在写每一行之前并不需要进行任何处理。