質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

意見交換

クローズ

5回答

1601閲覧

大量のファイルを扱うプログラムでファイル名の先頭の文字でフォルダ分けされている理由

jahqe4savjarmaj

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2023/08/17 08:02

0

0

大量のファイルを扱うライブラリなどで、以下の画像のように、ファイル名の最初の文字のディレクトリでフォルダ分けされているのをたまに見かけますが、これにはどのような意図があるのでしょうか。

1文字目のディレクトリの中にさらに2文字目の名前のディレクトリで分けられていることもありました。

検索が速くなるとかでしょうか。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答5

#1

maisumakun

総合スコア146544

投稿2023/08/17 08:07

検索が速くなるとかでしょうか。

そうですね、ファイルシステムによって限界は違いますが、1ディレクトリに大量のファイルを置くと遅くなることがあるとのことです(参考例)。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

otn

総合スコア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で収まるはず。
なので、キャッシュファイルの格納など、大量のファイルの追加削除が発生する場合は、ファイル名の長さを一定にすることが多いようです。ファイル名の長さが一定なら、全てのディレクトリーエントリーのサイズが同一で、削除したファイルの場所をそのまま再利用できるので、肥大化しません。肥大化すると読む量が増えるので、これも高速化のコツですね。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#3

shiketa

総合スコア4114

投稿2023/08/17 23:44

#2

余談です。
MS-DOS時代。ファイ名が 8文字.3文字 に制限されていた時代。フロッピーディスクで起動もできた時代。
フロッピーディスクにディレクトリをつくり、細かいファイルをいっぺ作ったら書き込めなくなった。容量に余裕はある。どうやら、ひとつのディレクトリに格納できるファイル数に制限があったらしい。200個くらいだったかと。仕方ないので、ファイル名の一部でディレクトリを分けた。
まさに…「でフォルダ分けされている理由」。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#4

otn

総合スコア86295

投稿2023/08/18 02:18

編集2023/08/18 03:16

MS-DOS時代。

#2の回答では、Unix/Linux系ファイルシステムに決め打ちして性能の話を書きましたが、#3のように、ファイルシステムによってはそもそも多数のファイルを1つのディレクトリーに入れるのが不可能というケースもありますね。
ルートディレクトリーとサブディレクトリーで個数上限が違ったはずと検索してみると、FAT16だと、ルートが512エントリー、サブディレクトリーで65534ですかね。まあ、ディスク全体のファイル数上限も65517個なので、サブディレクトリーで困ることはあまりないでしょう。
ルートディレクトリーだけ異なるのは、ルートディレクトリーがファイルじゃなくてディスク上の固定位置エリアだからでしょう。MS-DOSver1時代のサブディレクトリーと言う概念が無かった時のまま。

追記

後で思い出しましたが、FAT12というのがありましたね。ググってもルートディレクトリーのファイル数上限は見つからずですが、全体ファイル数上限が4077なので、ルートは255個弱で、これがご記憶の物だったのかも。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#5

ikadzuchi

総合スコア3047

投稿2023/08/26 17:39

>otnさん
ちょっと気になったので調べてみました。
FAT12のルートのファイル(ディレクトリエントリ)数の制限は可変ですが少なくともフロッピーで典型的なのは224個のようです。
なぜ微妙に中途半端なのか分かりませんが、手持ちのイメージファイルを見てどれも224個だったのと、ここから導けるフロッピーに入る最大サイズの1423KiBにファイルを分割するソフト(FileCut)があることからもかなり一般的なようです。

FATファイルシステムのデータ構造はこちらを参考にしました。
http://elm-chan.org/docs/fat.html

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問