簡體   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