2015-04-05 8 views
4

js + sequelize для вставки 280K строк данных с использованием JSON. JSON - это массив из 280K. Есть ли способ сделать объемную вставку в куски. Я вижу, что для обновления данных требуется много времени. Когда я попытался сократить данные до 40 тыс. Строк, он работает быстро. Я придерживаюсь правильного подхода. Пожалуйста посоветуй. Я использую postgresql как backend.Как сделать объемную вставку с помощью Sequelize и node.js

PNs.bulkCreate(JSON_Small) 
     .catch(function(err) { 
      console.log('Error ' + err); 
     }) 
     .finally(function(err) { 
      console.log('FINISHED + ' \n +++++++ \n'); 

     }); 
+0

Тот же вопрос здесь, с ответом: http://stackoverflow.com/questions/33129677/nodejs-promises-streams-processing-large-csv-files/33138965#33138965 –

ответ

3

Я использовал cargo полезность библиотеки асинхронном, чтобы загрузить в до 1000 строк за один раз. Смотрите следующий код для загрузки CSV в базу данных:

var fs = require('fs'), 
    async = require('async'), 
    csv = require('csv'); 

var input = fs.createReadStream(filename); 
var parser = csv.parse({ 
    columns: true, 
    relax: true 
}); 
var inserter = async.cargo(function(tasks, inserterCallback) { 
    model.bulkCreate(tasks).then(function() { 
     inserterCallback(); 
     } 
    ); 
    }, 
    1000 
); 
parser.on('readable', function() { 
    while(line = parser.read()) { 
    inserter.push(line); 
    } 
}); 
parser.on('end', function (count) { 
    inserter.drain = function() { 
    doneLoadingCallback(); 
    } 
}); 
input.pipe(parser); 
1

Если вы действительно хотите использовать bulkInsert, чем мой предыдущий ответ достаточно. Однако у вас будет много памяти, если у вас много данных! Лучше всего использовать некоторые встроенные методы базы данных. Проблема в том, что вы загружаете все данные в память до тех пор, пока не будет выполняться функция bulkCreate. Если у вас есть миллион строк, у вас, вероятно, закончится нехватка памяти, прежде чем она будет выполнена. Даже если вы ставите его в очередь, используя что-то вроде async.cargo, вы все равно будете ждать, пока db вернется к вам, пока данные неинтересно потребляют всю вашу память.

Мое решение состояло в том, чтобы вырезать sequelize для загрузки данных (по крайней мере, пока они не реализуют потоковое вещание или что-то (см. Их github issue #2454)). Я закончил создание db-streamer, но теперь он поддерживает только pg. Вы хотите посмотреть на streamsql для mysql.

1

Следующий вопрос имеет один и тот же ответ, что вам нужно здесь: NodeJS, promises, streams - processing large CSV files

  • использовать поток для чтения данных и проанализировать его;
  • используйте комбинацию методов stream.read и sequence от spex, чтобы прочитать поток и выполнить запросы один за другим.
Смежные вопросы