Ответ вслух Senior Потоки и буферы обновлено

Как импортировать CSV на 10 ГБ

Вопрос

Как бы ты загрузил в базу CSV-файл на 10 ГБ средствами Node.js?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Файл целиком читать нельзя, поэтому беру fs.createReadStream и парсер, который сам работает как поток, или readline для простого CSV. Читаю через for await: пока я не обработал текущую порцию, следующая не читается, так backpressure работает сам.

Что должно прозвучать в ответе

  • Не читать файл целиком: createReadStream + построчный разбор (readline или парсер-стрим)

  • Пачки (batch) по N строк в базу вместо вставки по одной

  • Backpressure: не читать дальше, пока пачка не записана (for await или pipeline)

  • Обработка ошибок строк: лог битых строк, не ронять весь импорт

  • Возобновление: запоминать прогресс (номер строки или байтовый offset)

  • Для максимума скорости: COPY в PostgreSQL через поток

Что могут спросить следом

  • Как показать прогресс пользователю?
  • Что делать, если импорт упал на середине?

Разбор

Файл целиком читать нельзя, поэтому беру fs.createReadStream и парсер, который сам работает как поток, или readline для простого CSV. Читаю через for await: пока я не обработал текущую порцию, следующая не читается, так backpressure работает сам.

Строки копятся в пачку, например по тысяче, и уходят в базу одним запросом. Вставка по одной строке будет в десятки раз медленнее. Если база PostgreSQL, самый быстрый путь это COPY FROM STDIN, куда можно направить поток через pipeline.

Битые строки не должны ронять весь импорт: пишу их в отдельный лог с номером строки. Прогресс сохраняю, например номер последней записанной пачки, чтобы при падении продолжить, а не начинать заново. Для пользователя прогресс считаю по прочитанным байтам относительно размера файла.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.