Как использовать потоки узлов для вставки больших данных в MySQL? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь использовать поток узла, чтобы вставить 10 миллионов записей в MySQL.Есть ли способ сделать это с потоком узла?Я не нахожу очень полезных или «дружеских» ответов или документации по этому вопросу.Пока я могу вставить 45K записей, но я получаю некоторые ошибки при попытке установить набор записей, который больше этого.

Кроме того, что обратный вызов в коде ниже должен делать здесь?Я не уверен, откуда я взял этот код, и я на самом деле не перезваниваю, так что, может быть, в этом проблема !!: D Есть идеи?Каким будет обратный вызов на самом деле?Может быть, обратный вызов должен принимать чанк и передавать чанк одновременно?Как я мог переработать это, чтобы заставить это работать последовательно?Я просто не думаю, что этот код ниже на самом деле разбивает данные на куски вообще.Как мне разбить его на управляемые куски?

В зависимости от количества записей, с которыми я пытаюсь это делать, я получаю разные ошибки.Я получаю следующие ошибки:

Для 50K - 80K иногда я получаю эту ошибку:

Error: connect ETIMEDOUT
    at Connection._handleConnectTimeout  

Я получаю эту ошибку для записей 100K или выше:

 Error: ER_NET_PACKET_TOO_LARGE: Got a packet bigger than 'max_allowed_packet' bytes
        at Query.Sequence._packetToError

Эта ошибка примерно для 55К записей:

Error: write EPIPE
    at WriteWrap.afterWrite [as oncomplete] (net.js:788:14)

Довольно дико получать 3 разные ошибки в зависимости от количества записей, которые я пытаюсь вставить.

Вот код (Этоработает нормально для 45000 записей, но не для чего-то большего):

var db = require('./index.js');
var faker = require('faker');
var stream = require('stream');

var songs = [];

var size = 10000000; 

var songList = function(){
  for (var i = 0; i < size; i++) {
      var song = [i, faker.random.words(1,2), faker.name.findName(), faker.internet.url(1,50), faker.random.words(1,2), faker.random.words(1,20)];
      songs.push(song);  
    }
  console.log('songs', songs);  
  return songs;
}

var songSql = "INSERT INTO songs (song_id, song_name, artist, song_url, song_album, song_playlist) VALUES ?";

var songValues = songList();

var songSeed = function() {
  console.log('x: ', x);
  var query = db.connection.query(songSql, [songValues]).stream({highWaterMark: 5});
  var testStream = new stream.Transform({highWaterMark: 5, objectMode: true});
  testStream._write = function(chunk,encoding,callback) {
    setTimeout(function() {
      console.log('my chunk: ', chunk);
      callback();
    },1000);
  }
  // Pipe the query stream into the testStream
  query.pipe(testStream)

  // Monitor data events on the side to see when we pause
  query.on("result",function(d,i) {
  console.log("Data Sent")
  })
}

songSeed();

1 Ответ

0 голосов
/ 31 января 2019

На сервере MySQL увеличьте max_allowed_packet до 1G.Там нет реального недостатка в этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...