2016-07-06 15 views
1

Ich muss aus einer sehr großen Sammlung lesen und einige Operationen auf jedem Dokument durchführen.Pymongo parallel_scan

Ich benutze PYMONGO parallel_scan, um diese Operationen auf eine Reihe von Prozessen zur Verbesserung der Effizienz zu tun.

cursors = mongo_collection.parallel_scan(6) 

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

Obwohl die Prozesse, die diese Cursor verwenden als erwartet beginnen und läuft, werden alle Prozesse beenden ihren Teil und Ausgang und schließlich nur ein Prozess für eine lange Zeit läuft weiter.

Es sieht so aus, weil parallel_scan die Dokumente nicht gleichmäßig auf die Cursor verteilt. Wie mache ich alle Cursor eine fast gleiche Anzahl von Dokumenten.

Antwort

0

Eine Lösung, die für mich in einer ähnlichen Position funktionierte, war die Erhöhung des Parameters, der an parallel_scan übergeben wurde. Dieser Parameter (der einen Wert zwischen 0 und 10.000 haben muss) steuert die maximale Anzahl von Cursorn, die der Befehl parallelCollectionScan von Mongo zurückgibt. Obwohl das Zurückholen von etwa 20 Cursorn eine Anzahl von Prozessen auf einmal startet, enden die Prozesse der viel kürzeren Cursors relativ schnell. Dies lässt die gewünschten 4-5 Cursor viel länger verarbeiten.

Auch eine kurze Anmerkung: nach der ist PyMongo nicht Multiprocessing-sicher auf Unix-Systemen. Ihre Methode endet damit, das MongoClient zu kopieren, das verwendet wird, um parallel_scan zu jedem neuen Prozess aufzurufen, den es gabelt.