2016-12-06 9 views
2

Я пытаюсь переместить данные 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(); 
     }); 
    }) 

Любая помощь о том, как идти об этом? Благодарю.

+0

Рассмотрите возможность использования курсоров на MySQL для извлечения только подмножество строк за раз: https://dev.mysql.com/doc/refman/5.7/en/declare-cursor.html –

+0

@DanArmstrong Я не вижу способа использовать курсор в парусах. Итак, я попробовал Streams, который больше похож на замену «Cursor», и чертовски все еще закончилось. –

+0

Я подозреваю, что запрос по-прежнему пытается загрузить все в память. Попробуйте быть явным в вашем объявлении курсора и выборки. Это будет означать зацикливание и выбор партии, возможно, 1000 за раз, пока вы не получите менее 1000 записей из выборки. –

ответ