2016-07-06 81 views
1

我需要从非常大的集合中读取数据并对每个文档执行一些操作。Pymongo parallel_scan

我正在使用pymongo的parallel_scan在多个进程上执行这些操作以提高效率。

cursors = mongo_collection.parallel_scan(6) 

if __name__ == '__main__': 
    processes = [multiprocessing.Process(target=process_cursor, args=(cursor,)) for cursor in cursors] 

虽然使用这些游标的过程如预期并开始运行开始,所有的流程完成自己的本分和退出,最终只有一个进程继续运行很长一段时间。

看起来像这是因为parallel_scan不会在光标之间平均分配文档。如何让所有游标具有几乎相同数量的文档。

回答

0

对于我在类似位置工作的一种解决方案是增加传递给parallel_scan的参数。此参数(必须具有介于0和10,000之间的值)控制Mongo的parallelCollectionScan命令返回的最大游标数。虽然回到20个左右的游标立即启动了多个进程,但游标的进程相对较短。这使希望的4-5光标处理时间更长。

另外,快速注意:根据PyMongo FAQ,PyMongo在Unix系统上不是多处理安全的。您的方法最终会将用于呼叫parallel_scanMongoClient复制到它分叉的每个新进程。