2016-04-22 5 views
0

Derzeit habe ich MongoDB auf einem EC2 mit Amazon Linux eingerichtet. Es hat ungefähr 1 Million Dokumente.EC2 Abfrage von großen Daten aus MongoDB mit Python schlägt fehl

Auf derselben EC2 verwendete ich pymongo db.collection.find ({}, {'attribute_1': 1}), um alle attribute_1 in allen Dokumenten abzufragen.

Das Problem ist, nach dem Iterieren und Abrufen von rund 200.000 Dokumente, mein Python-Code einfach zu arbeiten.

Es zeigt keinen Fehler (ich habe versucht, fangen). Im mongodb-Protokoll wird auch kein spezifischer Fehler angezeigt.

Ich vermute es wegen der EC2-Netzwerkbandbreite, aber ich habe versucht, die Dokumente in Stapeln zu teilen, mit 100.000 Dokumenten pro Batch. Und es funktioniert immer noch nicht. Es bricht nur bei etwa 200.000 Dokumenten automatisch ab. Der Code ist wie folgt:

Ich versuchte EC2 Protokoll auch und fand nichts Seltsames. Die EC2 funktionierte nach der Pause normal weiter (ich konnte immer noch auf die Befehlszeile zugreifen, CD, ls usw.). Meine EC2-Instanz ist c3.2xlarge. Ich bleibe derzeit für einige Tage mit dieser Hilfe, jede Hilfe wird geschätzt. Danke im Voraus.

Update: Nach Systemprotokoll der Suche, fand ich diese:

Apr 22 10:12:53 ip-xxx kernel: [ 8774.975653] Out of memory: Kill process 3709 (python) score 509 or sacrifice child 
Apr 22 10:12:53 ip-xxx kernel: [ 8774.978941] Killed process 3709 (python) total-vm:8697496kB, anon-rss:8078912kB, file-rss:48kB 

bereits Meine EC2-Instanz verfügt über 15 GB RAM. Das Attribut_1 ist eine Python-Liste von Wörtern. Jedes Attribut_1 besteht aus sehr vielen Elementen (Wörtern). Gibt es überhaupt für mich, um dieses Problem zu beheben?

+1

Wenn die Datenbank und der Pymongo-Client auf derselben Maschine ausgeführt werden, sollte es kein Problem mit der Bandbreite geben. Welche Größe haben die Dokumente? Welche Art von Daten gibt es auch in 'attribute_1'? –

+0

Hallo Steve Rossiter, es ist eine Python-Liste besteht aus mehreren Wörtern. Ich aktualisiere nur meine Frage, bitte werfen Sie einen Blick auf die Frage – Leo

+0

Das Problem ist, dass Sie sehr große Python-Listen erstellen. Der Grund für eine Datenbank ist, dass Sie nicht alle diese Daten im Speicher benötigen. Wenn Sie eine komplexe Aggregation durchführen müssen, sollten Sie das [aggregation framework] (https://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate) verwenden, um es zu manipulieren die Daten in Mongodb. –

Antwort

1

Sie scheinen eine sehr große Liste result zu erstellen, die den verfügbaren Speicher in der Instanz überschritten hat. Im Allgemeinen wird dies anzeigen, dass Sie einen Teil Ihres Systems neu entwerfen müssen, so dass nur die Daten, die Sie wirklich benötigen, von Python verarbeitet werden müssen. Einige Optionen:

  • pymongo des find kehrt ein cursor - vielleicht brauchen Sie nicht wirklich die Liste an allen
  • Prozessinformationen über die Daten, wie sie in einer anderen Sammlung
  • Verwenden von Abfragen eingefügt und Speicher und aggregation zurückzukehren, was Sie von der Db im Format benötigen Sie brauchen es
  • Split die Verarbeitung auf mehreren Rechnern

Es gibt andere Ansätze, aber ein Fehler wie dieser sollte Sie dazu bringen, sich zu fragen: "Brauche ich all diese Daten in einer Python-Liste?"

+0

Dank @Steve Rossiter für Ihre klare Antwort und Anleitung, um das Problem zu lösen! – Leo