2017-06-16 11 views
1

私はPlayのドキュメントのStreaming resultsセクションを読んでいます。私が期待していたのは、結果に基づいてScala Streamを作成する方法です。したがって、解析する必要のある10,000行を返す実行を作成すると、一度に100などのバッチで解析するか、最初のものを解析し、必要に応じて残りの部分を解析します(したがって、Stream)。Anorm(Play Scala)のストリーミングサポートの利点は何ですか?

基本的には、結果を1つずつ解析する方法ですが、最後にすべての解析結果を含むリストが作成されます(任意の制限付きでこの場合、100冊)。のは、ドキュメントからこの例を見てみましょう:行の非常に大きな数は、単に非効率的である解析

val books: List[String] = SQL("Select name from Books").as(str("name")) // please ignore possible syntax errors, hopefully understandable still 

答えて

0

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 
    } 

それは、次のような基本的な実装を何の利点を超える提供しません。簡単なクラスでは簡単には見えないかもしれませんが、いくつかの結合を追加してより複雑なパーサを作成すると、行数が数千に達すると大きなパフォーマンスが見られます。

私の個人的な経験から、パーサーが一度にすべてを処理しようとする5,000〜10,000行(およびそれ以上)を返すクエリは、プログラムが無期限に効果的にハングするほどのCPU時間を消費します。

ストリーミングでは、すべてを一度にすべて解析したり、すべての結果がワイヤを通じてサーバーに戻ってくるのを待っているという問題を回避します。

0

私が示唆しているのは、SourceとしてAkka StreamsというAnormクエリ結果を使用することです。 私はその方法で数十万行のストリームを正常に流しました。

関連する問題