【问题标题】:Write data to file in chunks using akka streams使用 akka 流将数据分块写入文件
【发布时间】:2020-03-23 17:19:04
【问题描述】:

我使用带有 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))

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

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

【问题讨论】:

    标签: java scala memory-management akka-stream sttp


    【解决方案1】:

    根据您的情节,您的应用程序不需要大量内存。有高达 1700 MB 的“峰值”,但在垃圾收集器运行之后,堆的使用量下降到 250 MB。 sttp 和 Akka 创建了很多短暂的对象;但是,垃圾收集器可以很好地清理您的记忆。

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

    sbt -mem 124 run
    

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

    【讨论】:

    • 同意。另一方面,使用 apache httpclient 和缓冲区重用的方法不会导致过多的内存布局。 val rd = new BufferedReader(new InputStreamReader(response.getEntity.getContent), 8192)
    • 如果与 apache httpclient(5-7%,峰值高达 20%)相比,我发现 akka 使用的 CPU 更重(10-15%,峰值高达 30%)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2015-11-24
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多