Importieren eines sehr großen Datensatzes mit nodejs in MongoDB

8

Bevor ich auf meine Frage eingehe, möchte ich darauf hinweisen, dass ich dies teilweise mache, um mich mit Knoten und Mongo vertraut zu machen. Mir ist klar, dass es wahrscheinlich bessere Möglichkeiten gibt, um mein endgültiges Ziel zu erreichen, aber was ich daraus herausholen möchte, ist eine allgemeine Methodik, die sich auf andere Situationen anwenden lässt.

Das Ziel:

Ich habe eine CSV-Datei mit 6 Millionen Geo-IP-Datensätzen. Jeder Datensatz enthält insgesamt 4 Felder und die Datei hat ungefähr 180 MB.

Ich möchte diese Datei verarbeiten und jeden Datensatz in eine MongoDB-Sammlung namens "Blocks" einfügen. Jeder "Block" enthält die 4 Felder aus der CSV-Datei.

Mein aktueller Ansatz

Ich benutze Mungo, um ein "Block" -Modell und einen ReadStream zu erstellen, um die Datei Zeile für Zeile zu verarbeiten. Der Code, den ich verwende, um die Datei zu verarbeiten und die Datensätze zu extrahieren, funktioniert und ich kann jeden Datensatz auf die Konsole drucken lassen, wenn ich möchte.

Für jeden Datensatz in der Datei ruft er eine Funktion auf, die ein neues Blocks-Objekt erstellt (mit Mungo), füllt die Felder und speichert sie.

Dies ist der Code innerhalb der Funktion, der jedes Mal aufgerufen wird, wenn eine Zeile gelesen und analysiert wird. Die Variable "rec" enthält ein Objekt, das einen einzelnen Datensatz aus der Datei darstellt.

%Vor%

Das Problem

Da die Datei asynchron gelesen wird, wird mehr als eine Zeile gleichzeitig verarbeitet und das Lesen der Datei ist viel schneller als MongoDB schreiben kann, so dass der gesamte Prozess bei etwa 282000 Datensätzen steht und bis zu 5k + Mongo gleichzeitig erreicht Verbindungen. Es stürzt nicht ab. Es sitzt einfach da und tut nichts und scheint sich nicht zu erholen, noch erhöht sich die Itemzählung in der Mongo-Sammlung weiter.

Was ich hier versuche, ist ein allgemeiner Ansatz zur Lösung dieses Problems. Wie würde ich die Anzahl der gleichzeitigen Mongo-Verbindungen begrenzen? Ich möchte den Vorteil nutzen, mehrere Datensätze gleichzeitig einfügen zu können, aber mir fehlt eine Möglichkeit, den Fluss zu regulieren.

Vielen Dank im Voraus.

    
SuitedSloth 08.11.2011, 04:09
quelle

2 Antworten

1

Ich würde versuchen, die Kommandozeilen-CSV-Import-Option von Mongodb - es sollte tun, was Sie wollen, ohne einen Code zu schreiben

    
sub 17.11.2011, 21:50
quelle
2

Keine Antwort auf Ihre genaue Situation beim Importieren aus der .csv-Datei, sondern beim Ausführen von Bulk-Einfüge (n)

- & gt; Vor allem gibt es keine speziellen "Bulk" -Einfügungen, es ist alles ein forEach am Ende.

- & gt; Wenn Sie versuchen, eine große Datei async -ly zu lesen, die viel schneller als der Schreibprozess wäre, dann sollten Sie überlegen, Ihre Vorgehensweise zu ändern, vor allem herauszufinden, wie viel kann Ihr Setup behandeln (oder nur Hit-n-Trial ).

--- & gt; Danach, ändern Sie die Art, wie Sie aus der Datei lesen, müssen Sie nicht jede Zeile aus der Datei lesen, async -ly, lernen zu warten, forEach verwenden, forEachSeries von Async.js, um Ihre Lesevorgänge in der Nähe von mongodb Schreibstufe, und Sie sind gut zu gehen.

    
TarunG 21.02.2012 22:15
quelle

Tags und Links