この記事は「fukuoka.ex x ザキ研 Advent Calendar 2017」24日目です。
昨日は @Takeshi-Kogu さんの「モジュールをファイルに書き込んでみる(後半)」でした。
はじめに
前回までに,
そこで, Flow.from_enumerables
に渡すStage数増やしたらどれくらい変わるのだろう? という疑問が生まれました。
と,いうわけでやっていきます!!!!
動作環境
自分のMacBook Proだとコア数が乏しいのでAWSを利用してみました。
- Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type
-
m5.24xlarge
- vCPU 96コア
- ECU 345
- メモリ 384 GiB
- Elixir 1.6.6 (compiled with OTP 21)
EC2インスタンス内のElixir環境の構築はDockerを利用しました。
ソースコード
defmodule Basic do
def q2_3(stage) do
:timer.tc( fn ->
"data.json"
|> File.stream!
|> Flow.from_enumerable(stages: stage)
|> Flow.map(fn d -> Poison.decode!(d) end)
|> Flow.filter(fn d -> d["age"] <= 20 end)
|> Enum.count end)
|> elem(0)
|> Kernel./(1000000)
end
end
実行結果
各Stage数ごとに10回計測を行いました。
その中で最速のものを載せました。
Stage数 | 実行時間(s) |
---|---|
4 | 7.457921 |
8 | 5.685359 |
16 | 5.59761 |
32 | 5.690283 |
64 | 6.001949 |
96 | 6.141198 |
192 | 6.184196 |
この環境だと,Stage数 16
で実行した場合が一番実行時間が短い結果になりました。
今回,平均は載せていないですが平均実行時間も同様の結果となりました。
終わりに
今回は,前回までにやった一千万のJSONファイルを利用して,FlowのStage数を増やすとどうなるのかをみていきました。
環境の問題かもしれませんが,並列数を増やせば速くなるという問題でもないようですね。
ローカルだと37秒
ほどかかっていた処理が5.6秒ほどで終わったので,計測がとても楽でした。。
明日は @zacky1972 さんの「ZEAM開発ログ v.0.3.1 非同期NIF呼出しにより1ms制約をクリアしてGPU駆動のパフォーマンスが改善された件」です。お楽しみに。