如何实现与akka-streams的分页

时间:2018-06-18 18:08:01

标签: akka-stream

我需要逐行处理大型文件,并在每个项目上做一些繁重的工作(在4核心cpu上),我认为代码是正确的:

implicit val system = ActorSystem("TestSystem")
implicit val materializer = ActorMaterializer()
import system.dispatcher

val sink = Sink.foreach[String](elem => println("element proceed"))

FileIO.fromPath(Paths.get("file.txt"))
  .via(Framing.delimiter(ByteString("\n"), 64).map(_.utf8String))
  .mapAsync(4)(v =>
    //long op
    Future {
      Thread.sleep(500)
      "updated_" + v
    })
  .to(sink)
  .run()

但我希望输出如下:

100 element proceed
200 element proceed
300 element proceed
357 element proceed. done

如何实施?

1 个答案:

答案 0 :(得分:0)

您可以使用Flow.grouped

val groupSize = 100

val groupedFlow = Flow[String].grouped(groupSize)

现在可以在您的mapAsync之前或之后注入此流程:

FileIO.fromPath(Paths.get("file.txt"))
      .via(Framing.delimiter(ByteString("\n"), 64).map(_.utf8String))
      .via(groupedFlow)
  ...