带有大型iteratables的Python pool.map

时间:2018-06-15 09:29:27

标签: python multithreading sqlite

我在数据库中有一个非常大的表(> 20GB)。我想从whith python读取所有行并打印它们。我正在使用SQLite数据库和Python 2.7

我的第一种方法很标准。我可以简单地查询所有行并迭代它们:

cur.execute('SELECT * FROM large_table')
for row in cur:
    print row

这可以按预期工作。

出于好奇,我想用multiprocessing.Pool做同样的工作。

def consumer(data):
    print data


cur.execute('SELECT * FROM large_table')
pool = Pool(5)

pool.map(consumer, cur, chunksize=1000)

但这根本不起作用。 .map()方法似乎试图将完整的iteratable(大型数据库表)加载到RAM中。过了一会儿,我的所有RAM都在使用而没有任何输出。

我是否遗漏了任何内容,或pool.map只是错误的工具?

干杯, 托拜厄斯

1 个答案:

答案 0 :(得分:0)

  

我错过了什么,或者pool.map只是错误的工具?

是的,您应该使用pool.imap()代替。在分派到工作进程之前,它不会“消耗”所有值。它应该是代码的简单修复。