Optimierung: Dumping von JSON von einer Streaming API zu Mongo

8

Hintergrund: Ich habe ein python -Modul eingerichtet, um JSON-Objekte von einer Streaming-API zu erfassen und sie in MongoDB mit pymongo zu speichern (Masseninsert von 25 gleichzeitig). Zum Vergleich habe ich auch einen Bash-Befehl für curl von der gleichen Streaming-API und pipe für mongoimport . Beide Ansätze speichern Daten in separaten Sammlungen.

In regelmäßigen Abständen überwache ich die count() der Sammlungen, um zu überprüfen, wie sie ablaufen.

Bis jetzt sehe ich das python -Modul um etwa 1000 JSON-Objekte hinter dem curl | mongoimport -Ansatz zurückbleiben.

Problem: Wie kann ich mein python Modul so optimieren, dass es ~ mit dem curl | mongoimport übereinstimmt?

Ich kann tweetstream nicht verwenden, da ich nicht die Twitter-API, sondern einen Streamingdienst eines Drittanbieters verwende.

Könnte mir bitte jemand hier helfen?

Python Modul:

%Vor%

Danke fürs Lesen.

    
Sagar Hatekar 01.06.2012, 18:26
quelle

2 Antworten

1

Ich habe die StringIO-Bibliothek losgeworden. Da der WRITEFUNCTION Callback handle_data in diesem Fall für jede Zeile aufgerufen wird, lade einfach den JSON direkt. Manchmal könnten jedoch zwei JSON -Objekte in Daten enthalten sein. Es tut mir leid, ich kann den Befehl curl , den ich verwende, nicht bereitstellen, da er unsere Anmeldedaten enthält. Aber wie gesagt, dies ist ein allgemeines Problem, das für jede Streaming-API gilt.

%Vor%     
Sagar Hatekar 10.06.2012, 15:50
quelle
3

Ursprünglich gab es einen Fehler in Ihrem Code.

%Vor%

Sie haben chunk_count zurückgesetzt, aber Sie haben die tweet_list nicht zurückgesetzt. Sie versuchen also zum zweiten Mal, 100 Artikel einzufügen (50 neue plus 50, die schon einmal an die DB gesendet wurden). Sie haben dies behoben, sehen aber immer noch einen Unterschied in der Leistung.

Das ganze Los ist etwas, das sich als Hering herausstellt. Ich habe versucht, eine große Datei von JSON zu verwenden und sie über Python zu laden oder über Mongoimport zu laden, und Python war immer schneller (sogar im abgesicherten Modus - siehe unten).

Bei genauerer Betrachtung Ihres Codes wurde mir klar, dass das Problem darin liegt, dass die Streaming-API Ihnen tatsächlich Daten in Blöcken übergibt. Es wird erwartet, dass Sie nur diese Stücke nehmen und in die Datenbank setzen (das macht mongoimport). Die zusätzliche Arbeit, die Ihr Python macht, um den Stream zu teilen, ihn einer Liste hinzuzufügen und dann regelmäßig an Mongo zu senden, ist wahrscheinlich der Unterschied zwischen dem, was ich sehe und dem, was Sie sehen.

Probieren Sie dieses Snippet für Ihre handle_data ()

aus %Vor%

Beachten Sie, dass Ihre Python-Einfügungen dies nicht sind im "abgesicherten Modus" laufen - Sie sollten dies ändern, indem Sie Ihrer insert-Anweisung das Argument safe=True hinzufügen. Sie erhalten dann eine Ausnahme für jede Einfügung, die fehlschlägt, und Ihr try / catch wird den Fehler ausgeben, der das Problem aufdeckt.

Es kostet auch nicht viel Leistung - ich mache gerade einen Test und nach etwa fünf Minuten sind die Größen von zwei Sammlungen 14120 14113.

    
Asya Kamsky 02.06.2012 20:45
quelle