I/Oはもはやボトルネックではない
(benhoyt.com)- 面接でよく聞かれる質問が2つある
- テキストファイル内の単語数を数えるプログラムを書いてください
- このプログラムの性能上のボトルネックはどの部分ですか?
- よく「ファイルから読むこと」という答えが出るが、もはやそうではない
- 10~20年前はそうだったが、2022年現在ではディスクからシーケンシャルに読むのは非常に高速(筆者も自分でテストするまでは知らなかった)
- ボトルネックになるのは、入力を処理・パースしてメモリに割り当てる部分:単語に分割し、小文字に変換し、ハッシュテーブルで頻度を数えるといった処理
- Python/Goで413MBのテキストファイル(キング・ジェームズ聖書を100回連結したファイル)をテストしてみると
- 読み込みは0.1~0.2秒で済み、処理には7秒から2秒までかかる
- 結論として、「ビッグデータ」を処理する場合、ディスクI/Oはボトルネックではない可能性がある
14件のコメント
どれだけシーケンシャルアクセスであっても、言語ごと、ライブラリごとにIOパイプの使い方や開発者のIO APIリクエスト頻度など影響する部分があるため、IOはもはやボトルネックではないと言うには前提が必要だと思う
ネットワークI/OはI/Oじゃないのか?www
どれだけ高速化しても、I/OはI/Oだ。だからこそ、プログラミングではI/O部分のためだけのソリューションが別個に存在する理由だ。
ビッグデータ用ディスクを全部 NVMe SSD にするって?(笑) いったいいくらするんだ……
ディスクI/Oで非常に苦しみながら、プラッタをできるだけ動かさないようにしなければならない仕事をしている私としては、不思議な話ですね。
本文には「シーケンシャル」という話が出ていますね。
seekをまったくしないのであれば、あながち間違った話ではないのかもしれません。
前提が誤った実験です。
もう少し詳しい説明をお願いします
ボトルネックというもの自体が、相対的な時間についての話です。
CPUの速度とI/Oを比較するのが適切です。
過去のI/Oより速くなったからといって、I/OがCPUより速くなることはありません。
mmapを使って仮想メモリにロードだけしておき、実際には CPU が演算するたびに読み込むこともありえます。CPU とすべてのメモリ(レジスタ、メインメモリ、ディスク)間の通信も、すべて I/O です。
https://stackoverflow.com/questions/5877797/how-does-mmap-work
ビッグデータを見極める基準が気になりますね
興味深いです。
今日もまた一つ知識が増えました。
https://news.ycombinator.com/item?id=33751266 にある最初のコメントのURLが面白いですね。
Napkin Math(ちょっとした数学)
シーケンシャルI/Oはほぼメモリ速度に近づいているとか..
「ナプキン・マス」という名前、あまりにも魅力的ですね。
UTF-8 を作るとき、ロブ・パイクがナプキンに走り書きして見せたとか。