gpt4 book ai didi

performance - 高效的序列转换为字符串

转载 作者:行者123 更新时间:2023-12-04 03:17:36 24 4
gpt4 key购买 nike

我有一个字符串序列 Seq[String] 代表标准输入行。

这些行映射到模型实体,但不能保证 1 行 = 1 个实体实例。

每个实体都用一个特殊字符串分隔,该字符串不会出现在输入的其他任何地方。

我的解决方案是这样的:

val entities = lines.mkString.split(myDelimiter).map(parseEntity)

parseEntity 实现不相关,它获取一个 String 并映射到表示模型实体的案例类

问题出在给定的输入上,我在 lines.mkString 上遇到了 OutOfMemoryException。 fold/foldLeft/foldRight 会更有效率吗?或者您有更好的选择吗?

最佳答案

您可以使用 akka 流和定界符框架来解决这个问题。参见 this section基本方法的文档。

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Framing, Source}
import akka.util.ByteString

val example = (0 until 100).mkString("delimiter").grouped(8).toIndexedSeq
val framing = Framing.delimiter(ByteString("delimiter"), 1000)

implicit val system = ActorSystem()

implicit val mat = ActorMaterializer()

Source(example)
.map(ByteString.apply)
.via(framing)
.map(_.utf8String)
.runForeach(println)

与 ByteString 的转换有点烦人,但 Framing.delimiter 仅为 ByteString 定义。

如果您喜欢更纯函数式的方法,fs2还将提供原语来解决这个问题。

关于performance - 高效的序列转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42421807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com