2016-07-06 26 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複製到它分叉的每個新進程。