テキスト(CSV)とRDBで1000万行の処理速度比較してみた

テキスト(CSV)とRDBで1000万行の処理速度比較してみた

データ蓄積・分析・活用こそが、昨今のIT業界において競争を優位に働かせるのは周知の事実。
しかし、膨大なデータ量は捌くのにスピードを犠牲にしがちになります。

そこで、今回はすべてのレコードを読み込んだ際に、テキスト(CSV)リレーショナルデータベース(RDB)とでどちらが優位性をもたらすのかを確認することにしました。

その検証の顛末を本記事でご紹介させていただきます。

検証に至った理由とは?

業務内ですべてのレコードを読み込む処理をかける必要ががあり、CSVとRDBのどちらで管理した方が良いのかを判定する必要が生じた、というのがキッカケです。

答えは検証結果を待つまでもなく、この場合はテキスト(CSV)の方が早いことは分かりきっています。ただ、どの程度早く、どの程度パフォーマンスが変わるのかを把握しておきたかったんですね。

検証結果の末、もしどちらを選択してもパフォーマンスにそれほど差がないようであれば、集積データの調査等でSQLが使えるRDBの方が利便性に富んでいるので、RDBを選択することも考えられます。

いずれにしても、固定概念を打ち崩すキッカケにもなるかもしれないので、検証を以ってスッキリさせたかったというのが最大の理由になります。

検証にあたって、こんな準備をしてみた

<環境は……>
通常業務に差し支えない範囲で使えるAtomマシンで検証を行ったので、以下のようなスペックのマシンで確認を行いました。

  • CPU …… Intel(R) Atom(TM) CPU D510 @ 1.66GHz
  • Memory …… 4GB
  • Disk …… SSD:約50GB

このAtomマシンで検証を行うと決めたものの、CPUがしょぼすぎてRDBが不利に働くような気がする。。。
とはいえ、他に確認できる最適な環境が用意できなかったので、結果に差が大きくつきすぎることを想定し、一応、ローカルMacでも確認することにしました。
そのローマルMacのスペックは以下の通りです。

Mac …… iMac(Retina 5K, 27-inch, Late 2015)

  • CPU …… iMac (Retina 5K, 27-inch, Late 2015) :4 GHz Intel Core i7
  • Memory …… 16 GB 1867 MHz DDR3
  • Disk …… SSD:128GB、HDD:2TB(……だと思う)

<データは……>
100万レコード、1000万レコードのデータをCSVとRDBで用意することにしました。RDBはMariaを使うのでMyISAMとInnoDBでそれぞれ用意。そのデータは以下の通りです。

111,222,333,444,555,666,777,888,999,0 ~ 111,222,333,444,555,666,777,888,999,0
それを100万レコードと1000万レコードの双方準備

<チェック方法は……>
Pythonの小さいバッチで行ってみます。
チェック内容は単純に「time.time()」で括って、処理毎に確認する方法を採りました。

<ファイルサイズ比較方法は……>
Diskリソースの使用量を確認。
これも確認しておきたかったことの1つ。

  • CSV …… 100万レコード:37MB/1000万レコード:363MB
  • MyISAM …… 100万レコード:約40MB/1000万レコード:約392MB
  • InnoDB …… トータル:約1GB以下

※他のDB分も含まれてしまったが、わずか数KB程度なので、影響がないレベルと判断

実際に検証してみた

<Atomマシン>

 タイプ100万レコード1000万レコード
CSVテキスト約0.5秒約5.5秒
MyISAMRDB約44秒約599秒
InnoDBRDB約321秒
約1141秒
 ※あまりにも遅すぎたため、1回だけの実行結果を記載

事前に懸念していたとおり、スペックの関係であまりにも遅い!
しかも、計測結果の差が大きすぎるので、やはり事前準備していた「ローカルMac」での確認も必要であると判断しました。
ただ、ローカルMacは様々なプロセスが挙がっており、正確性が劣ることが想定されるため、本来であればなるべく別の端末でやりたかったですねぇ……。で、そのローカルMacの結果はご覧の通り。

<ローカルMac>

 タイプ100万レコード1000万レコード
CSVテキスト約0.14秒約1.31秒
MyISAMRDB約2.5秒約32秒
InnoDBRDB約8秒
約53秒
 ※数回実行した値のおおよその平均値を実行結果として記載

Atomマシンでは差がつきすぎて試したローカルMacでしたが、それでもここまで差が出るとは正直想像していませんでした。
マシンパワーは使っているサーバと比較してあまり変わらないため、おそらく似たような結果になることでしょう。

判定は想像どおり、ただしその差は想像以上

やはり当初の想像どおりにテキスト(CSV)が早かったわけですが、その差は想像を超えていました。これでモヤモヤもスッキリといったところです。

実際、検証環境をガッチリと用意できたわけではないので、ぼんやりでしか判断できてなかったので単純な内容ですが、「当たり前」のことを根拠に基づく「当たり前」に昇華させることができたという点では、この検証を実行した行為が成功だったと言えるのではないでしょうか。

あとはその時々で運用しやすさとパフォーマンスを天秤にかけ、どちらかを選択すれば良いかなと思います。

コメント