Linuxにおける10億ファイル問題 97
量は暴力 部門より
あるAnonymous Coward 曰く、
ファイルシステムが大容量に対応し、ハードディスクの容量あたりの価格が安くなるにともない、1つのパーティションに入るファイル数も増えている。しかし、Red HatのRic Wheeler氏によると、100万ファイルではしっかりと動くファイルシステムも、10億ファイルともなるとスケーラビリティの問題が発生してくるとのこと。
詳細はLinuxcon 2010での発表スライド(PDF)及びLWNの記事を参照。
大量のデータを扱いたければデータベースを使うか、複数のパーティションに分割して使え、という話があると思われるが、発表スライドでは「ファイルシステムは無料で多くの人々にとって親しみやすく分かりやすい、また複数のパーティションに分割するとユーザーによるデータの管理が面倒になり、またディスクシークの最適化が難しくなる」とし、大容量のファイルシステムの必要性が説かれている。
現在でもRAIDやJBODを使って複数台のHDDを束ねれば「単一ファイルシステム内で10億ファイルを格納できるストレージ」は構築可能だが、その場合ファイルシステムの作成や大量のファイルの作成、ファイルシステムの修復などに時間がかかるという問題があるとのこと。Linux向けの最新ファイルシステムの1つであるext4では多量のファイルを格納できるように設計・開発が進められているが、とある大容量システムでテストした結果、それでもファイルシステムの作成に4時間、10億のファイルを書き込むのに4日、ファイルシステムのチェック(fsck)に2.5時間かかったそうだ。さらにfsckで大量のメモリを要するのも問題とのことだ。
ちなみに、このような大量のファイルを含むディレクトリに対して「ls」を実行すると最悪な結果になるそうで、lsはreaddir()とstat()でディレクトリ内のファイルを取得するために毎秒数千ファイル程度の処理しかできないそうだ。そのため、10億のファイルに対してlsを実行すると実行完了まで数日かかるという。
データをファイルとしてたくさん格納するようなシステムは作ってはいけない (スコア:5, 参考になる)
データをファイルとしてたくさん格納するようなシステムはそもそも作ってはなりません。
そのような場合にはDBMSを用いてblob形式でデータベースに格納すべきです。
障害から復旧できます。最近のファイルシステムにはジャーナリング
なども行われつつありますが、fsckなどのジャーナリングに頼らない
古いチェック方法が残っているので、ディレクトリの循環などを
チェックする必要がありチェックを終えるまでに時間がかかります。
情報をメモリ内に格納しなくてはなりませんが、この際大量のメモリが必要です。
32bitシステムでは、運用当初問題ない場合でも、使い込んでいく
うちにファイル数が増加し、ある日、メモリが足りずfsckを終えられず
マウントできない現象が発生する場合があります。
ファイルシステムのバックアップを取っていても、バックアップ
が壊れていないことを知ることはできません。DBMSなら運用中チェックを
行うことができますし、なにより、ファイルシステムでなんらかの
異常が検出される確率はDBMSで障害が検出される確率よりもはるかに
高いものです。
FreeBSDならbackground fsckが使えますので、時間の問題はないかも?
でも、おそらくDBMSを使ったほうがよいでしょうね。今ならHadoop
なんかも面白いかもしれないけどOracleなんかと比較するとまだまだ
信頼性に欠ける部分もあるような気はします。
Re:データをファイルとしてたくさん格納するようなシステムは作ってはいけない (スコア:2, 興味深い)
DBMS にしてもファイルシステム上のファイルとして存在しているのですが、
ext4 ファイルシステムでは巨大なファイルが破損する恐れがあります [ubuntu.com]
なんて場合はどうなるんでしょうね。
# #206 [launchpad.net] で解決?
そもそも ext4 や ext3 って信頼に値するファイルシステムなんでしょうか。
ファイルシステムのうそ臭さを検証している DOUBT [linuxfoundation.org]とか、
情報が更新されていると嬉しいのですが、、、。
Re:データをファイルとしてたくさん格納するようなシステムは作ってはいけない (スコア:3, 参考になる)
ファイルシステムはかなり複雑なコンポーネントですから、予期せぬ障害の原因になることがあります。
DBMSの開発者もそれはよく把握していて、ディスクをファイルとして使うのだけでなく、raw deviceとして使って信頼性を高めることができるようになっているのが普通です。
Re:データをファイルとしてたくさん格納するようなシステムは作ってはいけない (スコア:1)
大抵の場合はファイルシステムを経由せずに直接デバイスを操作するような設計にすると思います.
そういう実装ができないDBMSはエンタープライズ向けではないでしょう.
Re:データをファイルとしてたくさん格納するようなシステムは作ってはいけない (スコア:1)
ああ、MicrosoftがVistaに搭載しようとして挫折した [wikipedia.org]やつですね。
Re:データをファイルとしてたくさん格納するようなシステムは作ってはいけない (スコア:1, 参考になる)
今まではHDDが前提だったから、ヘッドがカリカリやる速度のことを考えると
ちっこいファイルが無数に出来るようなやり方は「ダメなんだろうな」ということが簡単に理解できましたけど
SSDがこれだけ普及すると「SSDなら制約ぜんぜんないんじゃね?」と変に勘違いされそう。
iPadの某電子書籍のアプリなんかは、キャッシュをちっこいファイルに無数に分割させてて
「これがSSDの使い方なのか~」と思いましたが。
Re:データをファイルとしてたくさん格納するようなシステムは作ってはいけない (スコア:3, 興味深い)
FUSEのエンタープライズシステムでの実績ってあるんですか?
個人的には「データが流れてこない」「openが成功しない」という状況になって、
rebootして再度処理を実行すれば済む(うまく動かない理由を追求しなくてもよい)
システムなら良いと思う。
でも、世の中には、一度うまく動かなくなったときにきっちり報告書を書かないと
いけないようなシステムや、10分程度の障害が莫大な経済損失につながるシステム
もあるわけで、そのようなシステムでは利用は避けるべきでしょうね。
FUSEは、ユーザプロセスがカーネルを通してファイルシステムを提供するシステムです。
ファイルシステムを提供するFUSEプロセスは任意のシステムコールを呼び出すことが
できるわけですが、FUSEプロセスからのあらゆるシステムコール呼び出しについて、
動作上問題が起こらないことが十分にテストされているとはいえません。
ですので、FUSEのカーネル部分とFUSEプロセスが呼び出したシステムコールとの間で
デッドロックが起こるような、そんなバグが残存しているような気がしてなりません。
Linuxの問題なの? (スコア:3, 興味深い)
殆どのOSで問題になりそうな気がするんですけど。(FileSystemの種類毎に程度は違うだろうけど)
10億ファイルをディスク内に記録しておいても大きな問題にならないOSを知っている人がいたら教えてください。
Re: (スコア:0)
ZFSはどうかなと思ったけど、似ているといわれてるBtrfsも同様に遅いみたいですね。
HAMMERは構造的にDBに近い気がするので速いかも?
Re:Linuxの問題なの? (スコア:4, 興味深い)
Windows(NTFS)で一日数千件のログファイルを単一フォルダに吐き出すシステムを知ってる。ファイルのサイズは100byte未満。
1ヶ月もするとそのフォルダをエクスプローラで表示するのに数十分かかるようになり、3ヶ月もするとログの書き出しに時間がかかり過ぎてシステムが止まった。
Re:Linuxの問題なの? (スコア:1, 参考になる)
同一フォルダにファイル100万個でも、dirは即座にファイルのリストを出力し始める。
再起動直後であっても。
Windowsナメんなよ。
マルチスレッド化するとか (スコア:2)
コア数のたくさんあるCPUが普通にあるから、じういう時も
処理能力だけは余ってるんじゃないかと思ったりするのですが。
Re: (スコア:0)
Re:マルチスレッド化するとか (スコア:3, 興味深い)
「並列化すればいいんじゃないか」というような単純な一言というのは背景にある理解と対象の範囲によって適切にも不適切にもなってしまうので判定が難しいです。
単純にストレージの性能限界にぶつかっている場合はCPU側のファイルアクセスを並列化すると状態は悪化します。
ストレージはシーケンシャルアクセスが得意でランダムアクセスは苦手だからです。この性能差はSSDを利用すれば大幅に緩和されますが、それでもなくなるわけではありません。
ストレージに限らずネットワークなどもを含めてI/Oは一般的に小容量の大量アクセスを行うと実効性能が落ちます(余談ですがCPU処理を考える場合はメインメモリもI/Oの一つとして考える必要があるぐらい遅いですね)。
まじめに大幅な高速化を考えるなら既存のファイルシステムの部分的な並列化を目指すよりも、現代的なコンピューターの性能の絶対値やバランスの変化に最適化されたファイルシステムを設計するところからになるでしょう。
以前に比べると現在のPCは一般的にはCPUの並列処理能力が活用されずに余力があり、メモリとストレージの容量はユーザーが使用するデータ量に対して余裕があります。
ファイルシステムの多くは省資源が基本でストレージの容量やCPUの計算能力の消費を最低限で済ませることが志向されていますので、その考え方、使用する資源の許容量の基準を変える中の一つに「CPUの処理を並列化する」というのも出てくると思います。
ただし、PC用のOSのファイルシステムの場合、それが利用されるシステムの規模は現行製品だけでもPCとは言い難いCPU数を搭載したシステムからシングルコアのAtom搭載のネットブックまでの幅があります。過去の製品を数年前のものまで含めるだけでその性能差はさらに大きく広がります。ストレージも同様です。
コンピューターの資源を積極的に利用するファイルシステムを導入したら大規模なシステムでは速くなったが自分のPCでは遅くなった、というようなことは歓迎されませんので実用を目的とする開発の場合、資源の利用に対しては保守的になるのが普通です。
素人の思いつきのようなものは既に考慮や取り組みがされていることが多いわけですが、実際の取り組みの例がZFS以降の最近実用化されたファイルシステムになるでしょう。並列処理についてもZFSでは圧縮ファイルシステムで活用されています。
ファイルシステムの歴史的な発展については連続的かつ活発に開発されているLinuxがわかりやすいと思いますが、ext2/3の世代、ReiserFS他の世代、BtrFSの世代でファイルシステムの設計が大きく異なっています。
昔は性能のバランスが違っていたという例を挙げると1998年にはUltra160 SCSIが提唱されており、その転送速度は160/MB/secに達していました。RAIDなどを用いた高価なストレージを接続すればそのインターフェース速度を十分活かせましたが、PCに接続した場合はCPUがそれを処理するのは大変でした。当時のメインメモリはPC100 SDRAMでインターフェース速度が800MB/sec、実効性能はその数分の一ですからメモリに読み込むだけで一仕事になってしまいます。
Re:マルチスレッド化するとか (スコア:2)
なるほど、HDD側に並列処理が必要なわけね。
Re: (スコア:0)
RAMディスクで処理する(いくらかかるんだ・・・?)ならCPU側の問題になりそうだけど。
Re:マルチスレッド化するとか (スコア:1)
某商用UNIXでの話ですが、一つのディレクトリの下に32K個程のサブディレクトリを作ったら、それ以上ディレクトリが作れなくなりました。これはそのOSの仕様だそうです。ファイルは32K個以上作れるのに。
で、そのディレクトリで
と実行すると、サブディレクトリ名が表示され始めるまでに十数秒~数十秒かかっていました。
Re:マルチスレッド化するとか (スコア:1)
・子ディレクトリが持つ、".." エントリによって、親ディレクトリのリンクカウンタが消費される.
・リンクカウンタは 16bit signed short.
カウンタが16bit signed shortで、サブディレクトリ毎に「..」と併せて2リンク消費するなら、16Kで限界が来てしまいませんか?
しかし、そういう制限ではなかったように記憶しています。うろ覚えですが。
ファイルシステムの制限としては、32Kを超えてサブディレクトリを作れるけど、mkdirで制限しているとか何とか。
#本当にうろ覚えで申し訳ない。
Re: (スコア:0)
lsってオプション無しでもファイル名でソートされて出てくるんだし、
最大10億のinode情報をメモリに展開しなきゃいけないわけでしょう。
それだけでメモリ何十GBとか必要になるんじゃないのかな・・。
実装知らないから推測ですけど、
ページングおきまくってて重いんじゃないのかな、と。
Re:マルチスレッド化するとか (スコア:1)
まあ、普通は一つのディレクトリにファイルを十億個も作るなんてタコな設計にはしないから問題ないでしょう。
タイトル毎にフォルダを作成して整理 (スコア:2, すばらしい洞察)
10億個のファイルがある時点で、管理がすごく面倒だと思うんだけど。
パーティション云々の問題じゃない気がするのは俺だけかな?
"問題"ではなく"今後の課題"では? (スコア:2, すばらしい洞察)
表示に数日かかるというlsは問題だとは思いますが。
まぁ、それでもファイル名が10文字だったとして、ファイル名の出力だけで10GBあるから、ある程度は仕方ないですね。
私はcdした直後に反射的にlsを打ってしまうので、こういうシステムには関わりたくないですが。
Linuxが問題なんじゃない、人間が問題なんだ! (スコア:2)
ファイル数が億のオーダーであることがわかっているなら「ls > hogehoge.txt」するよね。普通。
もうちょっと気が利くなら「ls hoge* > hoge_list.txt」でしょ。
画面で見ようとするならそれはオペレータが問題ありすぎると思います。
# 表示文字数の少ないコンソールと重たい回線は否応が無しに小技スキルを蓄積させるよねぇ…(泣)
---- ばくさん!@一応IT土方
Re:Linuxが問題なんじゃない、人間が問題なんだ! (スコア:2, 参考になる)
って、まずシェルがディレクトリを読んで、hoge*にマッチするファイル一覧を作ってアルファベット順にソートして、それからlsをfork&execして、lsが引数の各ファイルを順次statする・・・という処理になります。 ファイル数が億なディレクトリでこんな事を行うのはもっとドツボじゃ? なおexecの引数に渡せるデータサイズは128KB~2MB(OSによって違う)ので、hoge*にマッチするファイルが10000個とかあればもうそれでexecできません。
すでに指摘されているように、ls -f(statもsortもしない)がとりあえず一番速くファイル名一覧が得られます。
ls (スコア:1)
場合にも寄るのでしょうが、alias で --color が入っていたら、これを切るだけでだいぶ早くなります。
表示はだいぶ味気なくなりますが。
Maildirなメールサーバなら (スコア:1)
メーリングリストサーバーのメールやメルマガを通過したらそりゃあもう。。。
ここで*BSDの優位性をアピールっ! (スコア:0)
T/O
Re:ここで*BSDの優位性をアピールっ! (スコア:1)
*BSD の優位性というより UNIX の基礎な気がします。
/, /boot しか切られていないサーバを稀に見つけますが、
/var のログがパンクして login できなくなるとか怖くなります。
ファイルの数にしたって一つのディレクトリに数万ファイルで ls は実用に耐えません。
bash の補完も「何万ファイルあるけど、マジで?」と聞いてくるまでに数時間かかります。
FreeBSD は fsck に関してはBackground fsck [wikipedia.org]があるので、
優位と言えば優位なのかも知れません。
Solaris の恩恵を受けて ZFS を利用すれば、もっと色々と便利なのかも知れません。
Linux も LVM でパーティションの容量管理は比較的容易になったので、
パーティショニングは昔のように千里眼である必要はありません。
Re:ここで*BSDの優位性をアピールっ! (スコア:2)
昔のUNIXにありましたね。/があふれると、挙動が不安定になるやつ。だから、/var, /tmp, /homeは/と同じにするんじゃない、と。
他の方が書いている通り、最近のは無いと思いますよ。でも、慣例で分けてしまいます。VM上のテスト環境で、お任せモードでのインストールをするときだけ/の単発が出来上がりますが。
-- gonta --
"May Macintosh be with you"
Re:ここで*BSDの優位性をアピールっ! (スコア:1, 興味深い)
> /, /boot しか切られていないサーバを稀に見つけますが、
> /var のログがパンクして login できなくなるとか怖くなります。
単一パーテーションのDebian Lenny で確認しました。
領域がパンパンになるまで一般ユーザでファイルをたくさん作りましたが、
スーパーユーザになると予約領域が使えるらしく、もう少し沢山書き込みができました。
続いて、スーパーユーザでも書き込めなくなるまで埋めましたが、コンソールログインには支障ありませんでした。
# 流石に再起動するとカーネルパニックになったけどw
Re:ここで*BSDの優位性をアピールっ! (スコア:1)
> /var のログがパンクして login できなくなるとか怖くなります。
どのファイルシステムがfullになっても、ログインが出来なくなることはないと思いますよ?
ログは残らないですが。
Re:ここで*BSDの優位性をアピールっ! (スコア:1)
> FreeBSD で立てた Web Server で log lotation の予想を超えて貯まったために /var 130% とか起こしてしまい、
デフォルトだと予備領域が10%なので、さすがに110%を超えないんじゃないですかね。
> sshd すらスワップアウトされていたらしく login までに数分かかったことならあります。
数十分以上ってのもありますね。
メモリ不足やプロセステーブルがあふれた時などは、特攻隊コマンドが役に立ちます。
> exec su
パスワード間違えると、本当にそのままサヨナラです。
Re:ここで*BSDの優位性をアピールっ! (スコア:1, 参考になる)
background fsckはまったくスケーラビリティがなく、
起動前のsnapshotsにinode数に比例した時間がかかります。
十億ものファイルを持つファイルシステムをfsck -Bなんかしたら
丸1日くらいピクリとも動かないんじゃないですかね。
background fsck前提のファイルシステムは
newfs時に思い切りinodeの数を減らしましょう。
減らせば減らすほどsnapshotsが速くなります。
そうしないと使えたもんじゃありません。
なんというかその、使わないのが一番です。
Re: (スコア:0)
*BSDで10億程度のファイルを上記の基準で処理したら、どうなるの?
Re:ここで*BSDの優位性をアピールっ! (スコア:5, おもしろおかしい)
マジレスすると、そんなことをしなければいけないサーバを構築をしたニンゲンの首が吹き飛ぶ
処理できる様にしろと客から光の速度でクレームがくる
お前の設計で会社がマジやばい
Re:ここで*BSDの優位性をアピールっ! (スコア:2, おもしろおかしい)
>マジレスすると、そんなことをしなければいけないサーバを構築をしたニンゲンの首が吹き飛ぶ
以前、あるシステムを見てくれといわれて...
あのぉ、lsが返ってこないんですけど...
で、ディレクトリを一個あがって、ls -lしてみたらそのディレクトリのサイズが異常。
リンクの数も、7桁。
「なんかいっぱいファイルが入っているみたいですけど、分割できませんか?」
「それをしようとして、出来ないので困ってる」...
なんでも、社員情報を、社員番号.name.txt 社員番号.address.txt 社員番号.phone.txt
社員番号.緊急連絡先.address.txt 社員番号.緊急連絡先.phone.txt 社員番号......
10万人(正社員/契約社員/外注出向者等)分程度を、ひとりについて20ファイルくらい
にわけて、一カ所に入れて、簡易DBかわりに使っていたらしい。
なんでも、「下手にDB使うより簡単だし、検索もシェルでやるから簡単なんだ」とのことでした。
もちろん、全部、平文なわけで、「どうしてこーゆーの作ったの?」と聞いたら、「前任者が、
社員を一度に検索できるシステムを安く作れという命令で作った」そうだ。
各部署ではマル秘扱いの社員データを、毎日ダウンロードしてはマッチングして更新かけて
いたのが、どうも遅いし、終わった気配がないので心配で聞いてきたらしい。
Re:ここで*BSDの優位性をアピールっ! (スコア:2)
ある日再起動時にfsckが起動されて、丸1日かかったが何とかfsckを終えた。
月末恒例の処理しようとしたら、何かエラーがでる。と。
原因を調べたらファイルが存在しておらず、/lost+foundにファイルの残骸が。
バックアップのtarファイルから復元しようとしたが、tarでバックアップを取っていた時点では既にメタデータがおかしかったらしくファイルとして存在していなかった。
※ 作り話ですが、ふつうにありそうですよね。
Re:ここで*BSDの優位性をアピールっ! (スコア:1)
>バックアップのtarファイルから復元しようとしたが、tarでバックアップを取っていた時点では既にメタデータがおかしかったらしくファイルとして存在していなかった。
当時のtarにはたしか、8GB上限があってtarでは取れなかった。
部分だけバックアップしようとして、tar cvf /dev/rmt0 10*.*.txtで取っていたらしいのだが、ある日「too many arguments」で落ちたらしい。
その時は、もっと細分化してバックアップをとるとかで逃げたらしいけど、逃げ方が場当たりで、「1*は、100,101,102...で分けて、2番台は二桁で...9番台はそのまま」みたいなことやっていたね。
> ※ 作り話ですが、ふつうにありそうですよね。
本当にあった怖い話の一種かもね。
Re:ここで*BSDの優位性をアピールっ! (スコア:2, すばらしい洞察)
従業員10万人て、超大企業じゃないですか。
#開発費けちりすぎ。
Re:ここで*BSDの優位性をアピールっ! (スコア:1)
「既存のDB技術と一線を画し」 [srad.jp]した技術ですね!
Re:ここで*BSDの優位性をアピールっ! (スコア:1)
これほど、データベースを使った方が簡単な事例も少なそうですよね…。
本当にご苦労様です。
Re:ここで*BSDの優位性をアピールっ! (スコア:1, 興味深い)
なんでも、「下手にDB使うより簡単だし、検索もシェルでやるから簡単なんだ」とのことでした。
もちろん、全部、平文なわけで、「どうしてこーゆーの作ったの?」と聞いたら、「前任者が、
社員を一度に検索できるシステムを安く作れという命令で作った」そうだ。
性能やセキュリティが要件に入っていなかったのなら正しいかも。
性能はともかくちゃんと動いていたわけだし、いろんな部署の人が使っていたわけだし。
設計者もDBの方がいいことは知っていて(あるいは安く作れる方は破綻することを知っていて)、敢えてこういう実装にしたのではないかと深読みしてみました。
モデしてしまったのでAC
Re:ここで*BSDの優位性をアピールっ! (スコア:1)
>その程度なら社員番号の100番ごとにディレクトリ分けるだけで大幅にスピードアップできそうなものだが。
検索や洗い替えの処理とか、結構な数があって。それらが全て同じディレクトリにあることを前提に作られていたりする。
なもんで、データコピーの時間もさることながら、そういったスクリプトとかを洗い出すのが大変だったな。
結局、「まともなDBにしないと、今後も同じ様なことになる」ってなことで、要件定義から差し戻しにした。
NEWS-OSがまだBSD系だったころのお話。
Re:ここで*BSDの優位性をアピールっ! (スコア:1)
>ファイルとjoinして、その処理を社員番号でFor構文か何かで繰り返し処理すれば良いんじゃないの?
前述したけど、検索するのが「色々できる」ってことで、各利用者が勝手に検索系のスクリプトを組んでいて、それがデータ形式依存たっぷりなわけでね。
まずは「どういった使い方してるの?」を聞いたら、皆さん「rshで自分が書いたshellスクリプトでやっている」...で、そのデータをPC側で色々と料理していた。
セキュリティもへったくもありゃしないの。
でもって、データの容量的にも、当時のWSに付けるHDDの最大級をフルフル使っていて、サイズと処理速度が追いつかなかった。
>作業の実際が分からないけど、役職ごとの処理が多ければ役職毎、部署毎の処理が多ければ部署毎にディレクトリを作れば検索速度が上がるんじゃないか?
部署/役職のリストもあって、そこには社員番号だけを使っていたらしい。
なんでも、信頼できる最新のデータが、そのディレクトリにあるデータだってことで、部署/役職/勤務地等のデータには、社員のデータも一応色々と入っていたけど「あ、それメンテしてないから使わないことにしたんだ」...
さらに酷いことが発覚したというか、別の部署でもそのデータを使っていて、勝手に変えられないんだ!とか...
極端を言えば、部署外からのアクセスも出来ちゃう便利データだったわけで、「これはさすがにまずいだろう」と忠告したんですけどね。
SONY NEWSでls /dev (スコア:0)
Re:SONY NEWSでls /dev (スコア:2, 参考になる)
Re:SONY NEWSでls /dev (スコア:2, 興味深い)
ベタな実装をすると、ビットマップディスプレイをttyであるconsoleに見せかけるにはデバイスドライバのボトムハーフのところにビットマップ描画を行わせることになります。 結果として描画はデバイスドライバがかなり高い割り込みレベル(spltty())で行います。 なので、画面をスクロールする間にハードウェア割り込みを取りこぼしたりします。 それを避けるための実装の副作用で、コンソールの文字表示が妙に遅かった。
確か、コンソールへの文字描画用にconsdだったか?daemonを一つ用意して解決したはず。
Re:何を今更……… (スコア:2, 参考になる)
線形サーチじゃないファイルシステムとしては、ext3(dir_indexオプションをつけた場合)とかXFSはB-treeを使っているそうですが、それでも遅かったんですね。
Re:何を今更……… (スコア:3, 参考になる)
FreeBSDでは線形探索の遅さをカバーできるようdirhashが実装されました。ハッシュテーブルのサイズが固定だったりして、必ずしもO(1)のオーダーで検索できない時代もありましたが、今は最適化されてかなり改善されたはずです。ちなみに、ハッシュテーブルの動的な確保は2008年ぐらいの話題ですね。
UFS2 Dirhash、メモリ確保開放動的化でサイズ上限向上 - 性能は不透明
http://journal.mycom.co.jp/articles/2008/10/28/bsdcon3/index.html [mycom.co.jp]
Re:何を今更……… (スコア:2, 参考になる)
メールソフトの MH なんかはフォルダがディレクトリに対応して1メール1ファイルで保存してるので、
一つのフォルダにメールを貯め込みすぎるとすごく遅くなりましたね。
フォルダは階層的に作れるのですが、その処理のためにディレクトリ内にあるディレクトリを全て列挙する場合があって、
メールをたくさん貯め込んだディレクトリでは「サブディレクトリがあるかどうか」を調べるだけでもとんでもなく時間がかかってました。
で、あるとき出た「ディレクトリのリンク数を調べ、それが2だったらサブディレクトリは存在しないのでその下は探索しない」という枝刈りパッチが出て、
劇的に早くなったのを覚えています。あれは感動したなぁ。
#サブディレクトリの無いディレクトリでは、親から自身を指すのと、自ディレクトリ内の . でリンクカウントが2。
#サブディレクトリを作ると、サブディレクトリからの .. の数だけリンク数が増えていく、と。