2016-07-06 3 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_scan을 호출하는 데 사용 된 MongoClient을 복사하여 각각의 새 프로세스가 포크에 복사하는 것입니다.