为什么我的并行化方法无法扩展?

时间:2019-09-02 18:27:04

标签: python python-multiprocessing

  • 我必须遍历一个大集合(> 50GB)。
  • 我正在使用带有队列的游标和多处理池作为通信工具。
    • 它很慢(大约每秒1500个文档)。

我可以以某种方式加快处理速度以获得更多内存使用吗?

def dowork(args):

    uid = int(args.get('uid'))
    if map_userid_visits.get(uid):
        map_userid_visits[uid] += 1
    else:
        map_userid_visits[uid] = 1

def main():

    manager = Manager()
    map_userid_visits = manager.dict()
    start_time = time.time()
    print ('Start Time', start_time)
    cur = cursor.Cursor(mycollection)
    pool = multiprocessing.Pool(CONFIG_POOL_SIZE)
    iteration = 0
    for user_event in cur:
        pool.apply(dowork, (user_event, ))
    pool.close()
    pool.join()
    print map_userid_visits

1 个答案:

答案 0 :(得分:0)

您的方法无法扩展。主要问题是您一次只能发送一行,这样您就可以进行非常轻量级的操作。这意味着序列化的开销比工作本身要大得多。

也来自multiprocessing documentation

  

apply(func[, args[, kwds]])¶

     

使用参数args和关键字参数kwds调用func。 它会阻塞直到结果准备就绪。给定此块,apply_async()更适合于并行执行工作。此外,func仅在池的工作程序之一中执行。