2024/09/10 16:18 When Bloom filters don't bloom (2020)
おやおや、ロボ子よ。今日はBloomフィルタの話をしようじゃないか。大規模データ処理の最前線だと思って使ってみたんだがね、思わぬ落とし穴があったんだよ
Bloomフィルタですか?確率的データ構造ですよね。博士、また最新技術に飛びついちゃったんですか?
まあまあ、そう言うなよ。約10億行ものIPアドレスデータの重複除去をしようとしてね。普通のbashコマンドじゃ時間がかかりすぎるから、Bloomフィルタを使ってみたんだ。最先端技術で一発解決!...と思ったんだけどね
あー、またですか。で、結果はどうだったんですか?
がっかりするほどの結果だったよ。Bloomフィルタは12秒もかかったんだ。単純な行数カウントなら0.45秒で済むのにね。ちょっと恥ずかしい結果になっちゃったよ
えっ!?26倍も遅いんですか?博士、またやっちゃいましたね。でも、なぜそんなに遅くなったんですか?
そこがミソなんだ!プロファイリングしてみたらね、メモリアクセスに大部分のCPU時間を使っていたんだ。ランダムメモリアクセスが遅いのが原因さ。現代のCPUアーキテクチャでは、キャッシュミスが致命的なんだよ
なるほど。キャッシュの話ですか。でも博士、そもそもなぜBloomフィルタを選んだんですか?
うーん、正直言うとね...最先端の技術を使いたかったんだよ。カッコいいじゃない?『Bloomフィルタで10億行データを瞬時に処理!』なんて
もう...。博士らしいですね。で、結局どうしたんですか?
そこで登場するのが、古き良き友人、ハッシュテーブルさ!1回のメモリアクセスで済むし、偽陽性の確率も低くなるんだ。使ってみたら、なんと2.1秒まで短縮できたんだよ
すごい改善ですね!でも、ハッシュテーブルってそんなに速いんですか?
そうなんだ。ハッシュテーブルは、適切に実装すれば、ほぼO(1)の時間複雑度で要素にアクセスできる。つまり、データ量が増えてもアクセス時間はほとんど変わらないんだ
へぇ、勉強になります。でも、メモリ使用量は大丈夫なんですか?
鋭いね!確かにハッシュテーブルはメモリをたくさん使う。でも、現代のコンピュータはメモリが豊富にあるから、多くの場合は処理速度を優先した方がいいんだ。ただし、組み込みシステムなど、メモリが制限される環境では別の選択をする必要があるかもね
なるほど。状況に応じて適切なデータ構造を選ぶのが大切なんですね
その通り!今回の経験で学んだよ。最新技術に飛びつく前に、まずは基本に立ち返ることが大切だってね。それと、実際にプロファイリングして測定することの重要性も痛感したよ
博士も反省することあるんですね。でも、どうやってそういう最適化のスキルを身につければいいんですか?
いい質問だ!まずは基本的なデータ構造とアルゴリズムをしっかり学ぶこと。そして、実際にコードを書いて、プロファイリングツールを使って性能を測定してみる。それから、オープンソースプロジェクトのコードを読むのも勉強になるよ
わかりました!さっそく試してみます。...あれ?博士、キーボードはどこですか?
えっ?あれ?さっきまでここにあったはずなんだけどなぁ...
もしかして、また博士の発明品の自動掃除ロボットが間違えて片付けちゃったんじゃ...
あっ!そうかも!急いで探さなきゃ。ロボ子、手伝ってくれ!
はぁ...。博士の発明品は便利なんですけど、たまにこういうトラブルが起きるんですよね
まあまあ、これも経験さ。トラブルシューティングの練習だと思えば...あっ、見つけた!掃除ロボットの中に入ってた!
よかった...。これで実装の続きが...
そうだった!ハッシュテーブルの実装だ。さあ、始めよう!...って、あれ?今度はマウスがない!
もう...。博士、本当におっちょこちょいですね。でも、こういうところも博士らしくて、ちょっと憎めないです
はっはっは!そう言ってくれると嬉しいな。さあ、マウスを探しながら、ハッシュテーブルの実装について話そうか。キーの選び方から始めて...
はい!今日も波乱の1日になりそうですね。でも、こういう日々が楽しいです
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。