繁体   English   中英

Anorm(Play Scala)中流媒体支持的优势是什么?

[英]What's the advantage of the streaming support in Anorm (Play Scala)?

我一直在阅读播放文档中的Streaming结果部分。 我期望找到一种基于结果创建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

解析大量行只是效率低下。 对于一个简单的类,您可能不会轻易看到它,但是当您开始添加一些连接并具有更复杂的解析器时,当行计数达到数千时,您将开始看到巨大的性能损失。

根据我的个人经验,返回5,000 - 10,000行(以及更多)解析器尝试同时处理的查询消耗了大量CPU时间,以至于程序无限期地有效挂起。

流式传输避免了尝试一次性解析所有内容,甚至等待所有结果通过网络将其恢复到服务器的问题。

我建议使用Anorm查询结果作为Akka StreamsSource 我成功地以数十万行的方式流式传输。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM