Записывать данные в файл кусками, используя потоки akka

Я использую sttp lib с бэкэндом akka для загрузки файла с сервера. Любой из следующих подходов приводит к значительному объему памяти для загрузки файла размером 1 ГБ:

import com.softwaremill.sttp._

val file: File = new File(...)

sttp.response(asStream[Source[ByteString, Any]])
.mapResponse { src =>
    src.runWith(FileIO.toPath(file.toPath, options, 0))
}

sttp.response(asFile(file, false))

Графики последовательных загрузок в VisualVM для файла размером 1Гб.

Есть ли шанс записать данные кусками и удалить куски из памяти сразу после записи?

1 ответ

Решение

Согласно вашему сюжету, вашему приложению не требуется значительный объем памяти. Есть "всплески" до 1700 МБ, но сразу после этого сборщик мусора запускает использование кучи до 250 МБ. sttp и Akka создают множество недолговечных объектов; однако сборщик мусора достаточно хорошо очищает вашу память.

Я запустил ваше клиентское приложение с памятью 124 МБ только для того, чтобы убедиться, что для загрузки файла размером 1 ГБ не требуется 2 ГБ кучи:

sbt -mem 124 run

Приложение не аварийно завершило работу, оно просто использовало столько памяти, сколько было доступно.

Другие вопросы по тегам