Импорт очень большого набора записей в MongoDB с использованием nodejs

Прежде чем я углублюсь в свой вопрос, я хотел указать, что делаю это частично, чтобы познакомиться с node и mongo. Я понимаю, что, вероятно, есть более эффективные способы достижения моей конечной цели, но я хочу извлечь из этого общую методологию, которая может применяться в других ситуациях.

Цель:

У меня есть файл csv, содержащий более 6 миллионов записей гео-IP. Каждая запись содержит всего 4 поля, а размер файла составляет примерно 180 МБ.

Я хочу обработать этот файл и вставить каждую запись в коллекцию MongoDB под названием «Блоки». Каждый «Блок» будет иметь 4 поля из файла csv.

Мой текущий подход

Я использую mongoose для создания «блочной» модели и ReadStream для обработки файла построчно. Код, который я использую для обработки файла и извлечения записей, работает, и я могу заставить его выводить каждую запись на консоль, если я хочу.

Для каждой записи в файле он вызывает функцию, которая создает новый объект Blocks (используя мангуст), заполняет поля и сохраняет его.

Это код внутри функции, который вызывается каждый раз при чтении и анализе строки. Переменная rec содержит объект, представляющий единственную запись из файла.

block = new Block();

block.ipFrom    = rec.startipnum;
block.ipTo      = rec.endipnum;
block.location  = rec.locid;

connections++;

block.save(function(err){

    if(err) throw err;
    //console.log('.');
    records_inserted++;

    if( --connections == 0 ){
        mongoose.disconnect();
        console.log( records_inserted + ' records inserted' );
    }

});

Проблема

Поскольку файл читается асинхронно, одновременно обрабатывается более одной строки, и чтение файла происходит намного быстрее, чем MongoDB может записать, поэтому весь процесс останавливается на отметке около 282000 записей и становится настолько высоким. до 5k + одновременных подключений Mongo. Он не падает ... он просто сидит и ничего не делает и, кажется, не восстанавливается, и при этом количество элементов в коллекции mongo не увеличивается.

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

Заранее благодарю.

8
задан SuitedSloth 8 November 2011 в 16:14
поделиться