Я пытаюсь переместить данные mysql в MongoDB. Запись составляет более 3 миллионов строк. И каждый раз, когда он бежит из памяти даже после изменения моего узла запуска сценарияМиграция более 3-х миллиметров данных в MongoDB
"scripts": {
"debug": "node debug app.js",
"start": "node --max_old_space_size=5120 --optimize_for_size --max_executable_size=5120 --stack_size=5120 app.js",
"test": "node ./node_modules/mocha/bin/mocha test/bootstrap.test.js "
}
Я попытался с помощью нормальной функции обратного вызова и обещания и все еще ничего.
Всего Функция
var citiesInit = function(_setup) {
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : 'password',
database : 'WorldCities'
});
connection.connect();
connection.query('SELECT * FROM thecities', function(err, rows, fields){
if (err) {
console.log("The error: ", err);
}
var cityData = [];
rows.forEach(function(theCity){
var data = {
name: theCity.city,
state_code: theCity.region,
country_code: theCity.country,
population: theCity.population,
location: {
type: "Point",
coordinates: [parseFloat(parseFloat(theCity.longitude).toFixed(4)), parseFloat(parseFloat(theCity.latitude).toFixed(4))]
},
max_latitude: parseFloat(parseFloat(theCity.latitude).toFixed(4)),
max_longitude: parseFloat(parseFloat(theCity.longitude).toFixed(4)),
min_latitude: parseFloat(parseFloat(theCity.latitude).toFixed(4)),
min_longitude: parseFloat(parseFloat(theCity.longitude).toFixed(4))
}
var cityCreate = City.create(data);
cityData.push(cityCreate);
})
console.log('The Saved row is: ', cityData.length);
//With Promise
Promise.all([cityData]).spread(function (cityData){
if (cityData) {
console.log(cityData.length);
Setup.findOrCreate({slug: 'city', setup: true}, {name: 'City', slug: 'city', setup: true}).exec(function cb(err, setup){
console.log("Cities initialized successfully");
});
}
})
.catch(function (err){
console.log(err);
})
//Without Promise
City.create(cityData).exec(function cityCB(err, cities){
if (err) {
console.log(err);
}
if (cities.length) {
console.log(cities.length);
Setup.findOrCreate({slug: 'city', setup: true}, {name: 'City', slug: 'city', setup: true}).exec(function cb(err, setup){
console.log("Cities initialized successfully");
});
}
})
});
};
Я попытался с помощью Streams
слишком
connection.query('SELECT * FROM thecities')
.stream()
.pipe(stream.Transform({
objectMode: true,
transform:function(data, encoding, callback){
var data = {
name: data.city,
state_code: data.region,
country_code: data.country,
population: data.population,
location: {
type: "Point",
coordinates: [parseFloat(parseFloat(data.longitude).toFixed(4)), parseFloat(parseFloat(data.latitude).toFixed(4))]
},
max_latitude: parseFloat(parseFloat(data.latitude).toFixed(4)),
max_longitude: parseFloat(parseFloat(data.longitude).toFixed(4)),
min_latitude: parseFloat(parseFloat(data.latitude).toFixed(4)),
min_longitude: parseFloat(parseFloat(data.longitude).toFixed(4))
}
City.create(data).exec(function cityCB(err, city){
if (err) {
console.log(err);
}
//if (city.state) { console.log(city.state) }
callback();
})
}
}))
.on('finish', function(){
connection.end();
Setup.findOrCreate({slug: 'city', setup: true}, {name: 'City', slug: 'city', setup: true}).exec(function cb(err, setup){
console.log("Cities initialized successfully");
organizationInit();
});
})
Любая помощь о том, как идти об этом? Благодарю.
Рассмотрите возможность использования курсоров на MySQL для извлечения только подмножество строк за раз: https://dev.mysql.com/doc/refman/5.7/en/declare-cursor.html –
@DanArmstrong Я не вижу способа использовать курсор в парусах. Итак, я попробовал Streams, который больше похож на замену «Cursor», и чертовски все еще закончилось. –
Я подозреваю, что запрос по-прежнему пытается загрузить все в память. Попробуйте быть явным в вашем объявлении курсора и выборки. Это будет означать зацикливание и выбор партии, возможно, 1000 за раз, пока вы не получите менее 1000 записей из выборки. –