Я работаю над API REST с конечной точкой для загрузки файла размером более 2 ГБ.Я читал, что Java FileChannel.transferTo(...)
будет использовать нулевое копирование, если ОС поддерживает это.Мой сервер работает на локальном хосте во время разработки под моей MacBook Pro OS 10.11.6.
Я сравнил следующие два метода записи файла в поток ответов:
- Копирование фиксированного числабайты от
FileChannel
до WritableByteChannel
с использованием transferTo
- Считывание фиксированного количества байтов из
FileInputStream
в байтовый массив (размер 4096) и запись в OutputStream
в цикле.
Время, необходимое для файла объемом 5,2 ГБ, составляет от 20 до 23 секунд для обоих методов.Я попытался transferTo
с фиксированным числом байтов в одной передаче, установленным в следующие значения: 4 КБ (то есть 4 * 1024), 1 МБ и 50 МБ.Время, затрачиваемое на запись, находится в одном и том же диапазоне во всех 3 случаях.
Время, затраченное на запись, измеряется от до входа в цикл while до после выхода из цикла while, в котором байты считываются из файла.Это все на стороне сервера.Время сетевого перехода не учитывается.
Есть идеи о том, что может быть причиной?Я вполне уверен, что MacOS 10.11.6 должен поддерживать нулевое копирование (то есть sendfile
системный вызов).
EDIT (18.06.2008) :
Я нашел следующее сообщение в блоге за 2015 год, в котором говорится, что sendfile
в MacOS X не работает.Может ли быть так, что эта проблема все еще существует?
https://blog.phusion.nl/2015/06/04/the-brokenness-of-the-sendfile-system-call/