0
0
大量のファイルを扱うライブラリなどで、以下の画像のように、ファイル名の最初の文字のディレクトリでフォルダ分けされているのをたまに見かけますが、これにはどのような意図があるのでしょうか。
1文字目のディレクトリの中にさらに2文字目の名前のディレクトリで分けられていることもありました。
検索が速くなるとかでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
#1
総合スコア146544
投稿2023/08/17 08:07
検索が速くなるとかでしょうか。
そうですね、ファイルシステムによって限界は違いますが、1ディレクトリに大量のファイルを置くと遅くなることがあるとのことです(参考例)。
#2
総合スコア86295
投稿2023/08/17 14:53
編集2023/08/18 02:03先頭文字かどうかはどうでも良くて、末尾の文字で分割しても同じです。高速化のためです。
(ファイル名以外の情報で分割すると、その情報を得る余分な時間が掛かるので駄目ですが)
ディレクトリーもファイルの一種であり、ディレクトリー配下のファイルを扱うためには、ディレクトリーファイルを読んで、そこに書いてある目的ファイルの情報を得る必要があるという程度のことはご存じの前提で続けます。
Unix/Linux系の全てのファイルシステムを知っているわけではないですが、一般にディレクトリーの構造は、可変長のディレクトリーエントリー(可変長のファイル名と管理情報)が並んだ形式になっていて、データベースのような索引は無いので、ファイルを探すには先頭から見つかるまでディレクトリーファイルを読む必要があります。例えば、手元の/usr/bin
は36KBなので、/usr/bin/ls
の管理情報を知るために、平均すると18KBのファイルを読むことになります。
質問の例だと、ファイル名が40バイトくらい(ちゃんと数えてませんが)のようなので、管理情報込みで1つのディレクトリーエントリーが60バイトだと仮定します。で、ファイルが1万6000個あったとすると、1つのディレクトリーに入れた場合、ディレクトリーサイズは、960,000 で、ファイルオープンや削除などをするために1ファイルの管理情報を得るために、平均480,000バイト読むことになります。
これを1000個ずつ16分割すると、親ディレクトリーサイズは960で平均480バイト読む。子ディレクトリーサイズは60,000で平均30,000バイト読むので、親子合計で30,480バイトと、1ディレクトリーの場合の1/10以下です(16分割なのでおおよそ16分の1)。つまりメモリーのキャッシュやバッファの効果を無視すると十倍以上速い。(実際にはストレージの読み書きはバイト単位じゃなくてセクター単位なので、バイト数をセクターサイズで割って切り上げた回数の読み書きが発生します)
あと、ディレクトリーエントリーは可変長なので、ファイル名の長さが異なるファイルを追加・削除を繰り返すと、空き領域の断片化が発生して、ディレクトリーサイズが肥大します。手元の/tmp
はファイル数18個なのにサイズが112KBとかなり肥大化してます。作り直せば4KBで収まるはず。
なので、キャッシュファイルの格納など、大量のファイルの追加削除が発生する場合は、ファイル名の長さを一定にすることが多いようです。ファイル名の長さが一定なら、全てのディレクトリーエントリーのサイズが同一で、削除したファイルの場所をそのまま再利用できるので、肥大化しません。肥大化すると読む量が増えるので、これも高速化のコツですね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#4
総合スコア86295
投稿2023/08/18 02:18
編集2023/08/18 03:16MS-DOS時代。
#2の回答では、Unix/Linux系ファイルシステムに決め打ちして性能の話を書きましたが、#3のように、ファイルシステムによってはそもそも多数のファイルを1つのディレクトリーに入れるのが不可能というケースもありますね。
ルートディレクトリーとサブディレクトリーで個数上限が違ったはずと検索してみると、FAT16だと、ルートが512エントリー、サブディレクトリーで65534ですかね。まあ、ディスク全体のファイル数上限も65517個なので、サブディレクトリーで困ることはあまりないでしょう。
ルートディレクトリーだけ異なるのは、ルートディレクトリーがファイルじゃなくてディスク上の固定位置エリアだからでしょう。MS-DOSver1時代のサブディレクトリーと言う概念が無かった時のまま。
追記
後で思い出しましたが、FAT12というのがありましたね。ググってもルートディレクトリーのファイル数上限は見つからずですが、全体ファイル数上限が4077なので、ルートは255個弱で、これがご記憶の物だったのかも。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#5
総合スコア3047
投稿2023/08/26 17:39
>otnさん
ちょっと気になったので調べてみました。
FAT12のルートのファイル(ディレクトリエントリ)数の制限は可変ですが少なくともフロッピーで典型的なのは224個のようです。
なぜ微妙に中途半端なのか分かりませんが、手持ちのイメージファイルを見てどれも224個だったのと、ここから導けるフロッピーに入る最大サイズの1423KiBにファイルを分割するソフト(FileCut)があることからもかなり一般的なようです。
FATファイルシステムのデータ構造はこちらを参考にしました。
http://elm-chan.org/docs/fat.html
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。