Записывать данные в файл кусками, используя потоки 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
Приложение не аварийно завершило работу, оно просто использовало столько памяти, сколько было доступно.