fs2で始める関数型ストリーミング処理入門

 fs2で始める関数型ストリーミング処理入門

関数型ストリーミング処理に出会ったときにこわくない程度の感覚を掴むために

13931e88926096a8c8f4e2fa8b76ec50?s=128

Kazunari Mori

October 08, 2016
Tweet

Transcript

  1. None
  2. None
  3. None
  4. None
  5. None
  6. • 昨今のバズワード「ビッグデータ」とも戦える!!

  7. • データは次々流れてくる • 自分のところにデータが来たら、自分の やるべき処理を実行 • 処理済みデータは次の担当の元へ • def work(p:

    Pet): Pet = if (p.fallen) raise(p) else p • 1データを処理する関数を作るだけ! • (12本ためて箱に詰める、なども。)
  8. None
  9. fs2 Stream class Stream F _ O • O •

    F _ • fs2 util Catchable F fs2 Task Catchable F Task F O
  10. • Stream ファイル DB Web ファイル DB Web fs2.Stream

  11. • Stream List A def O2 O O2 Stream F

    O2 def O2 O Stream F O2 Stream F O2 def F2 O2 Stream F O Stream F2 O2 Stream F2 O2 Stream Stream Task java sql Connection • Stream Stream Stream
  12. None
  13. Stream F Byte Stream F String • ascii文字しか無いならば、すべて1文字1バイト。 • でも、半角カタカナはutf-8では3バイト・・・

    • こういうときにChunkという概念が便利。 trait Chunk[+A] • ChunkはA型のデータの幾つかの塊というイメージ
  14. • Stream O2 Chunk Chunk O2 • Chunk A Vector

    A Vector A Chunk Chunk A • 以下の点には注意が必要 • Chunkにはいくつデータが入っているのかわからない。 • どこかChunkに入ったデータは、次のChunkには入らない。 • Chunkのうち使いきれなかった分をキャッシュして、 次のChunkの先頭にくっつける処理が必要になる事が多い。 • Pipe型、Handle型やPull型を参照。 • fs2.textにutf8Decodeなどがあるので、ソースを読めば・・・。
  15. Stream def f[F[_], A]: fs2.Pipe[F, A, (A, A)] = {

    s => for { a <- s.take(1) b <- s.tail.take(1) c <- f(s.tail).cons1((a, b)) } yield c }
  16. None
  17. • 例えば、ソート処理。 データの中で最小の値をはじめに持ってくる。 データをすべて見ないと最小の値がわからない。 ⇒ すべてのデータを見るまで値をキャッシュする? • 無限に終わりが来ないストリームも簡単に作成可能。

  18. • ランダムアクセスが必要な処理全般が不可能。 一度使用した値は意図的にキャッシュしない限りは残らない。 • Lengthを取得するだけですべての値の走査が必須

  19. None