JavaのparallelStream

JavaのparallelStreamについて思いつくままに。

Java8から入ったStream APIで、parallelStreamを使うと簡単に並列処理が書けますが、streamparallelStreamを使い分けるという感覚じゃなくて、並列処理を書きたい場合にparallelStreamを使うといった形で使っています。

Java8になる前は、並列処理はExecutorService周り(ForkJoinPoolとか)を使って書いていましたが、それなりにコードを書く必要があったのと、書いたコードがシンプルじゃなくなる(やりたいことに対して冗長な)感覚がありましたが、parallelStreamだと単にリストに対する操作のプロパティとして切り替えるような感じになるので、とてもすっきり書けるようになりました。

なお、並列処理を書く場合に気にしているのは、

  • オブジェクトの共有は避ける
  • オブジェクトの生成コストが高いようなものは、オブジェクトのプーリングによって生成を抑える(共有ではなく、その時点での所有者は1タスクとなるように)
  • 並列処理にすることによるコストがあるので、並列化する単位を意識する(量が多い、または1つの処理が時間がかかるなど)

といったところです。

Apache Sparkは、並列処理をサーバ跨いで分散できるようにしていますが、分散は1サーバ内での並列処理以上にオーバヘッドがあるので、ちょっとしたものならば、1サーバ上でCPUを使い切るような形で並列処理させてあげるというのも、一つの手だと思っています。 それ以上あげたければ、Spark使うといった感じで。Sparkでもリスト処理を分散するイメージなので、どちらも延長上で考えやすいのではと思っています。