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

Write data to file in chunks using akka streams

我使用带有 akka 后端的 sttp lib 从服务器加载文件。 以下任一方法都会导致加载 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))

1Gb 文件的顺序加载的 VisualVM 图。

是否有机会以块的形式写入数据并在写入后立即从内存中逐出块

根据您的情节,您的应用程序不需要大量内存。 "spikes" 高达 1700 MB,但紧接着垃圾收集器 运行 堆的使用量下降到 250 MB。 sttp 和 Akka 创建了很多短命对象;但是,垃圾收集器可以很好地清理您的内存。

我 运行 你的客户端应用程序有 124 MB 内存只是为了验证它不需要 2GB 堆来下载 1GB 文件:

sbt -mem 124 run

该应用程序没有崩溃,它只是使用了尽可能多的可用内存。