大量のデータを処理するときに知っておきたい前提知識
大量のデータを処理するとき、何の工夫もないまま設計していると、すごく結果出力までに時間がかかる。このことはなんとなく分かってはいるけども、なんとなくのレベルなので勉強してみた。
遅くなる理由
結果からいうと、大量データを素直に捌こうとすると、メモリだけでは賄いきれず、ディスクを読み込む必要が出てくるため。ディスクは物理的制約があり、メモリと比べると探索にすごい時間がかかるため。 ではなぜメモリは探索が速く、ディスクは遅いのか?
メモリは電気的な部品
もともと電気的な部品のため、物理的制約を受けないので、探索を高速に行なえる。その上、データを転送するためのメモリとCPUとのハブもかなり速い。結果として、メモリはディスクと比べ、105〜106ほど速くなるとのこと。
ディスクは物理的な操作が必要
一方ディスクは、円盤にデータを記録していくため、探索する際にヘッドを移動させ、円盤を回転させ、といった作業をしなければならない。その上、データを転送する際のディスクとCPU間のハブもメモリのそれと比べ低速。
SSD使えば速くなるのでは?
SSDは物理的な回転がないので、探索自体を高速化することができるが、CPUへのデータ転送のときのハブ自体は変わらないので、やはりメモリと比べると遅い。
大規模データを扱うときのコツ
1. いかにメモリ上で処理させるか
メモリとディスクを比べると、圧倒的にメモリのほうが速いというのは自明である。なので出来る限り、メモリ上で処理させようとするのは自然な流れ。 昨今の主な工夫の仕方としては以下のようなものがある
- RedisのようなインメモリのDBを使う
- OSレイヤーで、一回でディスクから読み取るデータ量を増やす(メモリにたくさんデータを置く)
2. いかに扱うデータ量を少なくするか
メモリ上で処理させる方針をとり、さらに高速に処理したいとなると、次は扱うデータ量をできるだけ少なくする方法を考える必要がある。主な方法としては圧縮技術を活用する、といったものがある。例えば、ディスクにはアプリケーションファイルをまんまおくのではなく、圧縮し一つのファイルとして作っておき、転送する際も圧縮された小さなデータを送信し、転送先では圧縮ファイルをメモリ上で読み込み、ビルドするといった手法などがある。
3. データ処理に強いアルゴリズムを知る
ディスクを使用するとなったとしても、線形探索を愚直にやったのでは遅くなるのは仕方がない。なので探索アルゴリズムについて基礎的でも良いので知っておき、探索アルゴリズムを用途に合わせて使いこなす、という工夫で高速化することもできる。
4. 検索エンジン活用という解決策を考慮する
DBだけではそろそろ探索処理を賄うにはきついってなってくると、ある検索条件に特化した検索エンジン的なシステムを用意して、それを利用するというのも一つの手。
[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ)
- 作者: 伊藤直也,田中慎司
- 出版社/メーカー: 技術評論社
- 発売日: 2010/07/07
- メディア: 単行本(ソフトカバー)
- 購入: 80人 クリック: 1,849回
- この商品を含むブログ (133件) を見る