了解Python多处理

时间:2015-05-09 03:23:33

标签: python multiprocessing

我创建了一个每行读取文件行的​​脚本,但是我有一个大文件(32GB),因此需要很长时间才能完成。

这里是多处理的地方,为了加快速度,但是我不太了解这个read_in_chunks函数,有人可以帮助我吗?

这是脚本:

def read_in_chunks(file_object, chunk_size=1024):
    """Lazy function (generator) to read a file piece by piece.
    Default chunk size: 1k."""
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data

 f = open('teste.txt')
 for piece in read_in_chunks(f):
    print piece

谢谢大家。

更新抱歉,我忘了说我将在MySQL DB中插入的行

2 个答案:

答案 0 :(得分:3)

read_in_chunks是一个在文件中返回一些字节数chunk_size的函数。 read_in_chinks是一个生成器并使用yield运算符,以便在需要这些块之前不会将这些块存储到计算机的内存中。 你说你的脚本是“逐行”的,从技术上来说它是“chunk”的'chunk'。这种区别可能看起来很迂腐,但重要的是要注意。

并行读取文件不会给你带来任何性能提升。 (假设计算机设置正常)物理硬盘驱动器只有一个读写头,因此头部无法同时在两个位置读取文件的两个部分。 想象一下,你的眼球试图在同一时间同时从两页读取。不会发生。 因此,读取文件称为输入/输出绑定(I / O界限), 更多进程无法加速读取文件。

但是, 更多进程可以帮助您加快对从文件中读取的数据的处理速度。

现在,您对从文件中读取的数据运行的操作称为print。如果要在代码中添加多处理元素,则会发生这种情况。 您的主要流程将读取几个数据块。然后每个块将被传递到一个单独的进程,然后每个进程将打印该块。 显然,打印不是一个CPU密集型操作,因此考虑到产生新进程的开销,以这种方式进行多处理是没用的,并且会造成更多的损害而不是好处。

但是,如果对数据的操作是cpu密集型的,例如采用一串文本并计算其Weissman分数的复杂算法,则多处理将是有益的。

主要流程会读取大量数据块,并将每个块传递给单独的进程。每个过程都会计算数据的Weismann分数,然后将该信息返回给主过程。

这是一些伪代码:

 def calc_weissman_score(chunk_of_data):
     # a bunch of cpu intensive stuff here that take a lot of time
     print 42

 f = open('teste.txt')
 gigabyte = 1000000000
 process_pool = 5 processes # use multiprocessing module for this
 for piece in read_in_chunks(f, chunk_size=gigabyte):
     if there are not processes in the process pool:
          wait until there are processes in the process pool
      spawn a new process that calls calc_weissman_score(piece)

简而言之,多处理不会帮助您从文件中读取数据,但它可能会加快处理数据所需的时间。

答案 1 :(得分:0)

您的read_in_chunks函数只为您提供了一个生成器对象,该对象按块读取文件块。并行没有任何进展,你不会看到任何加速。

事实上,并行读取文件不太可能带来任何加速。在非常基本的硬件级别考虑它:您只能在任何给定时刻从硬盘驱动器上的一个位置读取数据。顺序读取文件的速度与任何并行尝试一样快。

我认为this answer提供了一个很好的整体图片,可以帮助您处理大文件。