Я пытаюсь использовать поток узла, чтобы вставить 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();