我想跳过从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进程在内存中增长到几千兆字节。我该如何解决?
感谢您的帮助:)
答案 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,所以如果有很多行处理时间很短,它会更有效。