Python多处理map_async

时间:2012-12-17 15:15:25

标签: python asynchronous map multiprocessing

我想跳过从map_async返回的结果。他们在记忆中成长,但我不需要它们。

以下是一些代码:

def processLine(line):
    #process something
    print "result"
pool = Pool(processes = 8)
for line in sys.stdin:
    lines.append(line)
    if len(lines) >= 100000:
        pool.map_async(processLine, lines, 2000)
pool.close()
pool.join()

当我必须处理具有数亿行的文件时,python进程在内存中增长到几千兆字节。我该如何解决?

感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

您的代码有错误:

for line in sys.stdin:
    lines.append(line)
    if len(lines) >= 100000:
        pool.map_async(processLine, lines, 2000)

这将等到lines累积超过100000行。之后,在每个额外行的100000多行的整个列表中调用pool.map_async

目前尚不清楚你到底想要做什么,但是 如果您不想要返回值,请使用pool.apply_async,而不是pool.map_async。也许是这样的:

import multiprocessing as mp

def processLine(line):
    #process something
    print "result"

if __name__ == '__main__':
    pool = mp.Pool(processes = 8)
    for line in sys.stdin:
        pool.apply_async(processLine, args = (line, ))
    pool.close()
    pool.join()

答案 1 :(得分:0)

是的,你是对的。有一些错误

我的意思是:

def processLine(line):
  #process something
  print "result"
  pool = Pool(processes = 8)

if __name__ == '__main__':
  for line in sys.stdin:
    lines.append(line)
    if len(lines) >= 100000:
      pool.map_async(processLine, lines, 2000)
      lines = [] #to clear buffer
  pool.map_async(processLine, lines, 2000)
  pool.close()
  pool.join()

我使用了map_async,因为它具有可配置的chunk_size,所以如果有很多行处理时间很短,它会更有效。