Как импортировать CSV на 10 ГБ
Вопрос
Как бы ты загрузил в базу CSV-файл на 10 ГБ средствами Node.js?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Не читать файл целиком: 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 ошибок.
Термины по теме
Ещё по теме «Потоки и буферы»
- Пачки из асинхронного итератора
- Разбиение потока на строки по чанкам
- Запись с учётом backpressure
- Итоги платежей из CSV-выгрузки
- Слияние k отсортированных логов
- Топ эндпоинтов по access-логу с нормализацией маршрутов
- Сессии пользователей по потоку событий
- Код-ревью: выгрузка и загрузка больших файлов