使用akka流将数据分块写入文件中

问题描述 投票:3回答:1

我将sttp lib与akka后端一起使用,以从服务器加载文件。以下任何一种方法都会导致大量内存占用,以加载1Gb文件:

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))

1VM文件的顺序加载的VisualVM图。enter image description here

写完之后是否有机会将数据分块写入和[[从内存中逐出数据块?

java scala memory-management akka-stream sttp
1个回答
0
投票
根据您的情节,您的应用程序不需要大量的内存。最多有1700 MB的“峰值”,但是在此之后,垃圾收集器运行后,堆的使用量下降到250 MB。sttp和Akka创建了许多短命对象;但是,垃圾收集器可以很好地清除内存。

我仅以124 MB的内存运行您的客户端应用程序,以验证它不需要2GB的堆来下载1GB的文件:

sbt -mem 124 run

该应用程序没有崩溃,它只使用了可用的内存。enter image description here
© www.soinside.com 2019 - 2024. All rights reserved.