并行文件解析,多个CPU核心

max*_*max 12 python parallel-processing python-3.x

我之前问过一个相关但非常普遍的问题(尤其是这个回答).

这个问题非常具体.这是我关心的所有代码:

result = {}
for line in open('input.txt'):
  key, value = parse(line)
  result[key] = value
Run Code Online (Sandbox Code Playgroud)

该函数parse是完全独立的(即,不使用任何共享资源).

我有Intel i7-920 CPU(4核,8个线程;我认为线程更相关,但我不确定).

我该怎么做才能使我的程序使用该CPU的所有并行功能?

我假设我可以打开这个文件,在8个不同的线程中读取而没有太多的性能损失,因为磁盘访问时间相对于总时间来说很小.

Sin*_*ion 18

cPython不提供您正在寻找的线程模型.您可以使用multiprocessing模块和进程池获得类似的东西

这样的解决方案看起来像这样:

def worker(lines):
    """Make a dict out of the parsed, supplied lines"""
    result = {}
    for line in lines.split('\n'):
        k, v = parse(line)
        result[k] = v
    return result

if __name__ == '__main__':
    # configurable options.  different values may work better.
    numthreads = 8
    numlines = 100

    lines = open('input.txt').readlines()

    # create the process pool
    pool = multiprocessing.Pool(processes=numthreads)

    # map the list of lines into a list of result dicts
    result_list = pool.map(worker, 
        (lines[line:line+numlines] for line in xrange(0,len(lines),numlines) ) )

    # reduce the result dicts into a single dict
    result = {}
    map(result.update, result_list)
Run Code Online (Sandbox Code Playgroud)


nos*_*klo 8

  1. 将文件拆分为8个较小的文件
  2. 启动单独的脚本来处理每个文件
  3. 加入结果

为什么那是最好的方式......

  • 这很简单 - 您不必以任何与线性处理不同的方式编程.
  • 通过启动少量长时间运行的进程,您可以获得最佳性能.
  • 操作系统将处理上下文切换和IO多路复用,因此您不必担心这些问题(操作系统做得很好).
  • 您可以扩展到多台计算机,而无需更改代码
  • ...