Прежде чем я углублюсь в свой вопрос, я хотел указать, что делаю это частично, чтобы познакомиться с 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? Я хотел бы воспользоваться возможностью одновременной вставки нескольких записей, но мне не хватает способа регулировать поток.
Заранее благодарю.