2016-08-11 2 views
0

Я новичок в узле и всей неблокирующей парадигме ввода-вывода. Я импортирую CSV из 1,8 миллиона строк в базу данных. Он работает, если я усекаю CSV до меньшего количества строк, но у меня заканчивается память для большего количества строк. Мой ORM - это sequelize, основанный на async/обещании.Импорт больших csv строк в базу данных без исчерпания памяти

Вот упрощенная фрагмент моего кода:

csv() 
.from.path(thePath) 
.on('record', function(row,index){ 
    models.meshblock.findOrCreate({ 
     where: {item_code: row[0]}, 
    }) 
}) 

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

Если бы был только способ сказать: «Закончите эту строку, сохраните ее в базе данных, подождите, пока все будет сделано, освободите память, а затем продолжите», тогда процесс должен быть очень медленным, но по крайней мере должен быть способный к завершению без исчерпания памяти.

Является ли моя оценка правильной? И как я могу обойти его и импортировать строки, не исчерпывая память?

+0

Имеет ли 'findOrCreate' обратный вызов? Если это так, возможно, вы можете придумать сменную смену make-shift, чтобы вы могли выполнять команду 'findOrCreate'. – zero298

+0

findOrCreate возвращает обещание. Так что да, я постараюсь сделать паузу в потоке csv до тех пор, пока не начнутся первые 1000 обещаний, а затем продолжим. Спасибо за совет. –

ответ

0

Возможно, что наибольшее число способ - использовать механизмы, специфичные для конкретной базы данных. Примеры:

+0

К сожалению, есть некоторая бизнес-логика, которая должна состояться в каждой строке, поэтому это не так просто. –

Смежные вопросы