概要
社内のシステムでDBから抽出したcsvファイルのデータ加工にEmbulkを導入し、その際にfitlerのプラグインではじめはembulk-fitler-evalというプラグインを使用していたが、データ量が多くなるにつれ、著しく処理時間が増えてしまった。。。。
プラグインの見直しを行いembulk-fitler-ruby_procというプラグインを見つけ、導入した結果大幅な速度改善をすることができたので、その速度比較の結果のメモを残す。
※今回は特に設定内容の詳細は記載致しません。
検証対象csvファイル
データサイズ | 行数 | 列数 | delimiter | quote |
---|---|---|---|---|
78.5 MB | 1249988 | 5 |
, (カンマ) |
" (ダブルクォーテーション) |
7.5 GB | 3841276 | 307 |
, (カンマ) |
" (ダブルクォーテーション) |
データ量が少量のものと著しく多いもので処理速度の比較検証を行います。
加工内容
処理内容は至って簡単で下記です。
- カラム内に含まれる改行コードをエスケープする置換処理
速度比較
1. データ量が少量
embulk-filter-eval | embulk-filter-ruby_proc |
---|---|
1分18秒 | 41秒 |
2. データ量が大量
embulk-filter-eval | embulk-filter-ruby_proc |
---|---|
3時間30分39秒 | 49分20秒 |
検証結果
上記速度比較のように、プラグインをembulk-filter-evalからembulk-filter-ruby_procに変えただけで、
データ量が少量の場合は約47.7%減 (- 27秒)
データ量が大量の場合は約76.5%減 (-2時間41分19秒)
という結果となった。
データ量が少量の場合は、そもそもembulk-filter-evalでも1分程で終わっていて-27秒減で多少の改善程度に見えるが、データ量が大量のもので比較をするとその差は一目瞭然。
3時間半もかかっていた処理が1時間もかからず終わってしまった。
考察
そこまでゴリゴリ無理くりなデータ加工を行うわけではないのであれば、十分embulk-filter-ruby_procで事足りますし、何と言っても速度が速い....
あと、evalについては1年前にフロントエンドの開発をしてた時に、上司からセキュリティホールができやすかったりするので使わないほうが良いとご教授頂いたので、個人的にあんまりいい印象ではなかったので...
今回はembulk-filter-ruby_proc一択でした。