Выбор ответа Junior Потоки и буферы спрашивают часто обновлено
Как отдать большой файл по HTTP
Вопрос
Нужно отдать клиенту файл на 4 ГБ, не съев память сервера. Какой вариант правильный?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: await pipeline(fs.createReadStream(path), res). Поток читает файл кусками по 64 КБ, а pipeline учитывает backpressure: если клиент качает медленно, чтение приостанавливается.
Варианты ответа
res.end(await fs.promises.readFile(path))res.end(fs.readFileSync(path))await pipeline(fs.createReadStream(path), res)правильный ответres.write(await fs.promises.readFile(path, "utf8"))
Разбор
Поток читает файл кусками по 64 КБ, а pipeline учитывает backpressure: если клиент качает медленно, чтение приостанавливается. Память занята только буферами.
- Оба варианта с
readFileпытаются загрузить все 4 ГБ в память. На делеreadFileдля файла больше 2 ГБ вообще броситERR_FS_FILE_TOO_LARGE. readFileSyncвдобавок блокирует event loop.- Чтение как
utf8ещё и испортит бинарный файл.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Потоки и буферы»
- Пачки из асинхронного итератора
- Разбиение потока на строки по чанкам
- Запись с учётом backpressure
- Итоги платежей из CSV-выгрузки
- Слияние k отсортированных логов
- Топ эндпоинтов по access-логу с нормализацией маршрутов
- Сессии пользователей по потоку событий
- Код-ревью: выгрузка и загрузка больших файлов