Python多处理映射

2024-06-23 18:45:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

下面是一些代码:

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进程的内存会增加到几千兆字节。我该怎么解决?

谢谢你的帮助:)


Tags: 记忆代码infordeflineresultprocess
2条回答

您的代码有一个错误:

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

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

不清楚你到底想做什么,但是 如果不需要返回值,请使用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()

是的,你说得对。有一些虫子

我是说:

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是因为它有可配置的块大小,所以如果有很多处理时间很短的行,它会更高效。

相关问题 更多 >

    热门问题