我有一大串字符串。现在我想将这些块写入文件。在每个文件中我想写 N 个块。我写了下面的代码来解决这个问题。但我的方法肯定不是惯用的。
object Diff extends App{
implicit val cs: ContextShift[IO] = IO.contextShift(ExecutionContext.global)
val l: Stream[Pure, (Chunk[String], Int)] =
Stream("Jakob", "Leo", "Tom", "Anton", "Lavinia", "Daniel")
.intersperse("\r\n")
.chunkN(4)
.zip(Stream(1,2,3,4))
val writeJob: Stream[Pure, ExitCode] = l.map {
case (ch, i) =>
val path = Paths.get(s"file_$i")
Stream.resource(Blocker[IO]).flatMap { blocker =>
Stream.chunk(ch)
.covary[IO]
.through(text.utf8Encode)
.through(file.writeAll(path, blocker))
}.compile.drain.as(ExitCode.Success).unsafeRunSync()
}
writeJob.compile.drain.as(ExitCode.Success)
}
1)所以我unsafeRunSync()
不止一次打电话这是一个缺陷(因为地图被多次调用)。但我不知道如何以另一种方式解决它。我是 FS2 和 Cats-Effects 的新手。
2)另外,我在chunkN(4)
这里打电话。在我的例子中,这看起来是无害的。但在我的实际用例中,我会使用chunkN(10 ^ 6)
. 我是否Chunks
从文档中正确理解 FS2 会在内存中累积 10^6 块,然后将它们发送到下游?
我知道有一个 fileRotate 函数,它可以和 Bytes 一样工作,limit
但我认为它在我的用例中并没有真正的帮助。
谢谢