我一直在阅读Play文档中的Streaming results部分。我期望找到一种基于结果创建Scala Stream
的方法,因此如果我创建一个返回需要解析的10,000行的运行,它将分批解析它们(例如每次100个)或者只是解析第一个并在需要时解析其余部分(所以,Stream
)。
我发现(根据我的理解,我可能完全错误)基本上是一种逐个解析结果的方法,但最后它会创建一个包含所有已解析结果的列表(如果您愿意,可以使用任意限制) ,在这种情况下 100本书)。我们来自文档中的这个例子:
val books: Either[List[Throwable], List[String]] =
SQL("Select name from Books").foldWhile(List[String]()) { (list, row) =>
if (list.size == 100) (list -> false) // stop with `list`
else (list := row[String]("name")) -> true // continue with one more name
}
它为基本实现提供了哪些优势,例如:
val books: List[String] = SQL("Select name from Books").as(str("name")) // please ignore possible syntax errors, hopefully understandable still
答案 0 :(得分:0)
解析大量行只是效率低下。对于一个简单的类,您可能不会轻易看到它,但是当您开始添加一些连接并拥有更复杂的解析器时,当行数达到数千时,您将开始看到巨大的性能损失。
根据我的个人经验,返回5,000 - 10,000行(以及更多)解析器尝试同时处理的查询消耗了大量CPU时间,导致程序无限期地挂起。
Streaming避免了尝试一次解析所有内容,甚至等待所有结果通过网络将其恢复到服务器的问题。
答案 1 :(得分:0)
我建议使用Anorm查询结果作为Source Akka Streams。 我成功地以数十万行的方式流式传输。