Ich versuche, 8.000.000 Zeilen von Daten aus Microsoft SQL Server in MongoDB zu kopieren. Es funktioniert gut für 100.000 Datensätze, aber wenn ich versuche, eine Million Datensätze (oder alle) zu ziehen, bekomme ich folgende Fehlermeldung:Streamen von 1m Datensätzen von SQL Server zu MongoDB mit Node.js
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory
Hier ist der Code (Coffee) Ich bin derzeit mit:
MsSqlClient = require 'mssql'
MongoClient = require('mongodb').MongoClient
config = {}
config.mongodb = 'mongodb://localhost:27017/dbname'
config.mssql = 'mssql://user::[email protected]/dbname'
Promise.all(
[
MongoClient.connect config.mongodb
MsSqlClient.connect config.mssql
]
).then (a) ->
mongo = a[0]
sql = a[1]
collection = mongo.collection "collection_name"
request = new MsSqlClient.Request()
request.stream = true
request.on 'row', (row) ->
collection.insert(row)
request.on 'done', (affected) ->
console.log "Completed"
sql.on 'error', (err) ->
console.log err
console.log "Querying"
request.query("SELECT * FROM big_table")
.catch (err) ->
console.log "ERROR: ", err
Es scheint, dass das Schreiben in MongoDB viel länger dauert als der Download von SQL Server, von dem ich glaube, dass er einen Engpass verursacht. Gibt es eine Möglichkeit, den Stream von SQL Server zu verlangsamen (pausieren/fortsetzen), sodass ich in Chunks ziehen und schreiben kann, ohne eine Indexspalte in den SQL-Daten hinzuzufügen und nach Zeilennummer zu wählen?
Running:
- Windows 7, SQL Server 2012 (SP1), MongoDB 2.8.0
- Node.js 4.2.4/3.3.0 mssql/mongodb 2.1.19
'Prozess aus Speicher 'ist * nicht * ein Timing-Problem. Es ist offensichtlich erstickt auf die schiere Menge an Daten, die Sie auf einmal übertragen. Mach es in Chargen. –
Was ist der beste Weg, um es in Chargen zu tun? Deshalb habe ich gefragt, ob ich den Stream pausieren soll (etwa alle 1000 Zeilen) und wieder aufnehmen soll, nachdem diese 1000 Datensätze auf Mongo geschrieben wurden. Oder sollte ich der SQL-Tabelle einen numerischen Index hinzufügen und gleichzeitig Zeilen nach Indexnummer 1000 ziehen (SELECT * FROM big_table WHERE id BETWEEN 1000 und 2000)? –