9

org.reactivestreamsライブラリを使用して Java NIO を使用して大きなデータ ストリームを処理するコード例はありますか(高パフォーマンスのため)? 私は分散処理を目指しているので、Akka を使用した例が最適ですが、それは理解できます。

scala でファイルを読み取るほとんどの (すべてではないことを願っています) 例は、Source(非バイナリ) または直接の Java NIO (さらにはFiles.readAllBytes!)に頼っています。

おそらく、見逃したアクティベーター テンプレートがありますか? ( Akka Streams with Scala!は、バイナリ/NIO 側を除いて、私が必要とするすべてに密接に対応しています)

4

2 に答える 2

9

このようなファイルを消費するために使用しないでくださいscala.collection.immutable.Stream。その理由は、メモ化を実行するためです。つまり、怠惰ですが、ストリーム全体をメモリにバッファリング (メモ化) したままにします!

これは、「ファイルのストリーム処理」について考えるときに絶対に望んでいることではありません。Scala の Stream がこのように機能する理由は、機能的な設定では完全に理にかなっているためです。たとえば、これにより、フィボナッチ数の計算を何度も簡単に回避できます。詳細については、ScalaDocを参照してください。

Akka Streams は、Reactive Streams の実装を提供し、FileIOここで使用できるクラスを提供します (必要な場合にのみ適切にバックプレッシャーをかけてファイルからデータを引き出し、残りのストリームがそれを消費する準備ができています)。

import java.io._
import akka.actor.ActorSystem
import akka.stream.scaladsl.{ Sink, Source }

object ExampleApp extends App {


  implicit val sys = ActorSystem()
  implicit val mat = FlowMaterializer()

  FileIO.fromPath(Paths.get("/example/file.txt"))
    .map(c ⇒ { print(c); c })
    .runWith(Sink.onComplete(_ ⇒ { f.close(); sys.shutdown() } ))
}

Akka Streams での IO の 操作に関するその他のドキュメントを次に示します。これは執筆時点での Akka のバージョンであることに注意してください。

お役に立てれば!

于 2015-01-07T12:10:42.253 に答える