今日もプログラミングスマートフォン用の表示で見る今日もプログラミングIT技術とかプログラミングのこととか特にJavaを中心に書いていきますこの広告は、90日以上更新していないブログに表示しています。2015-04-21embulk-output-oracleのパフォーマンスを計測してみたEmbulkembulk-output-oracleとは?embulk-output-oracleについては何度か書いているが、一応概要を。embulkは、オープンソースのバルクデータ転送ツールで、プラグインにより様々な入出力に対応することができる。embulk-output-oracleも出力プラグインの1つで、CSVファイルなどをOracleにロードするのに使える。計測にはAWSのm1.xlargeインスタンスを使った。コア数は4で、メモリは7.5GB。入力元のCSVファイルと出力先のOracleのデータファイルは、同じディスク(インスタンスストア)に置いた。データ量は、50,000,000件(約21GB)。別のあるツールでも同じデータをロードし、その時間を目標値として設定した。計測パターンembulk-output-oracleには、3つのINSERT方法がある。ダイレクトパスINSERT。normalより速い。ネイティブライブラリを使ったダイレクトパスINSERT。directより更に速い。これらについて計測した。ファイルを分割して入力するembulk-input-filesplitプラグインを組み合わせると、もっと速くなる。デフォルトでは8分割(コア数×2)だが、2分割、4分割についても計測してみた。3つのINSERT方法全てと組み合わせるのは面倒なので...、ociだけと組み合わせた。それから、入力ファイルを別のディスク(EBS)に置くパターンもやってみた。出力先が同一ディスクの場合。9入力元と出力先が異なるディスクの場合。8normalに比べると、oci+embulk-input-filesplitは劇的に速くなっている!とは言え、目標値には届いていないので、もう少し速くしたいところだ。分割数ほどには速くなっていないのは、ファイル入力やOracleへのINSERTがボトルネックになるからだろう。ここをもうちょっと突っ込んで調べてみたい。プロファイル結果という訳で、YourKitを使って分析してみた。licenseという無料のライセンスがある。同一ディスクと別ディスクの2パターンで、10%以上時間が掛かっているメソッドを抽出してみた。入力ファイルの読み込みやはり入出力まわりに時間が掛かっている。OracleへのINSERTはこれ以上無理っぽい気もするが、ファイルの分割入力の方はまだ改善の余地があるかもしれない。OSによる違いもあるかもしれないなあ。文字コード変換にも結構時間が掛かっているが、これも何か高速化テクニックがあるのかも。CSVTokenizerももう少し改善できそうだ(なお、同一ディスクの方では6%くらいだった)。ちなみに、同時にとったWindowsのパフォーマンスカウンタはこんな感じ。0.5(4/22追記)参考まで、PushbackInputStreamとCharsetの呼び出し階層はこんな感じ。java.nio.charset.Charset#encodeまとめ以前よりはだいぶ速くなったけど、まだ目標値には差がある。こちらをご参照ください。»プロフィールid:hito4_t中堅SIerでアーキテクトっぽいことやってます。IT技術とかプログラミングのこととか特にJavaを中心に書いていきます。(3)はてなブログをはじめよう!hito4_tさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。