性能の大きなunixディレクトリー VSディレクトリツリー?
-
13-09-2019 - |
質問
私のPHPプロジェクトを使用単位千絵や各ニーズに、単一の番号で保存す。
私が最初に考えたすべての画像を単一のディレクトリ名のファイル"0.jpg", "1.jpg", "2.jpg", そして"4294967295.jpg".
これより性能的にディレクトリの作成ツリー構造や名称のファイルのようなもの"429 / 496 / 7295.jpg"?
の場合は回答があり、その後に続く質問することはできない。何が最適な量subdirsまたはファイルレベルのか。とはどのような影響がある、選択されたファイルシステムにおいて。
それぞれのファイルにて対応するMySQLの付符号なしLONGINT id番号です。
お願い致します。
解決
これは、使用されているファイルシステムに依存します。 EXT {2,3,4}は、彼らが合理的に高速な1つのディレクトリにも、数百万のファイルを数千人を保存するか、作るその作成されたときに設定することができますdir_indexオプションが用意されています。
のbtrfsまだ生産準備ができていないが、それは暗黙的に非常に基本的なレベルで、このアイデアをサポートしています。
しかし、あなたはdir_indexあるいは他のほとんどのUnixのファイルシステムなしのextシリーズを使用している場合は、ディレクトリのいくつかのレベルを持っていることのより複雑なスキームのために行く必要があります。私はあなたがた場合はあなたができることを避けることを示唆しています。それはちょうど何かのファイルシステムのための余分な合併症の多くがあなたのために合理的に取り扱いされるべき追加されます。
あなたはがのより複雑なスキームを使用して、私は進の数字をコードし、各レベルで256ファイル/ディレクトリを持つことをお勧めします。各ディレクトリ内のファイルを大量に処理するように設計されていないファイルシステムは、一般的にリニアスキャンを行います。目標は、自分でBツリー型の構造を近似することです。各レベルの2進数エンコーディングディレクトリの一般的な手段とレベルごとに半分4kiB(共通サイズ)のディスク・ブロックについてのあなたに与えます。それはあなたがベース23またはベース24にあなたの番号をコードするような、本当に複雑なスキームなしで取得するつもりだと同じくらい良いことだ。
他のヒント
はい、ハードツーと言う、かなり、おそらくあなたは、データベース
を使用する必要があります従来の知恵は、 「データベースを使用」が、ファイルシステムを使用すると画像のようなより大きな物体のための合理的な計画である。
いくつかのファイルシステムは、ディレクトリエントリの数に制限があります。いくつかのファイルシステムは、ファイル名のルックアップのためのデータ構造の任意の並べ替えを持っていますが、ちょうどディレクトリのリニアスキャンを行いません。
あなたのような最適化が議論されているが、特定の環境のプロファイルに制限されています。あなたも今すぐあなたのアプリケーションが実行されるか、将来のハードウェアを知っていますか?ファイルシステムを強調し、素敵な、階層ディレクトリ構造を作成していないのは良い考えかもしれませんか?あなたがそれを行う場合には、任意のファイルシステムまたはストレージサーバ上でうまく動作します。
1つのディレクトリに数千のファイルを持つことは、かなりのものが遅くなります。私は安全な数が512をさらに良くディレクトリあたり1024個のファイル、次第だと思います。
その答えは、もちろん、:それはその時々です。
特にによって違いますので、それぞれるファイルシステムのご使用となります。例えば、 ext2 や ext3 ファイルシステムの制限の数のファイル当たりディレクトリです。そのファイルシステムができないすべての写真一ディレクトリ!
うみもの以外のファイルシステム。の会社に勤めていない店舗の素材をふんだんに使った、動からファイルベースの保管、データベースに基づく保存を実行 Apache Jackrabbit.