ご存じのように、1つのフォルダーに大量のファイルを保存しないでください。 システムクラッシュは非常に迅速に発生する可能性があります。または、単にファイルの読み取りが非常に遅くなります。
この問題を解決するために、多くのプログラマーはmd5ファイル名f789f789abc898d6892df98d09a8f8を使用し、次のように名前を分割します。
/f7/89/f789abc898d6892df98d09a8f8.jpg
ここでの計算は非常に簡単です-1文字は16オプションです。
したがって、2文字はすでに16 * 16 = 256オプションです。
この場合、それぞれ2文字のネストが2つあるため、フォルダーの最大数は256 * 256 = 65536フォルダーになります。
1,000,000個のファイルを保存する必要がある場合、各フォルダーのファイル数は1,000,000 / 65536 = 15ファイルを超えません。
はい、オプションは簡単ですが、ファイルを適切に保存するだけでなく、すばやく見つける必要がある場合はどうでしょうか?
たとえば、ソーシャルネットワークがあり、各ユーザーがID番号を持つ個別のフォルダーを作成し、その中にファイルを保存し、さらにそのフォルダーに独自のIDがあるようにします。
そして、私たちにとっては、ファイルを保存するだけでなく、idによってファイルの場所をすばやく見つけることも重要です。
この問題を解決するために、フォルダーツリー構造のサーバーに多数のファイルまたはフォルダーを保存できるクラスを作成しました。
クラスが作成する構造は次のとおりです。

この構造に収まるファイルの最大数を計算するには、フォルダー内のファイルの最大数を、枝の数に1を加えた程度まで上げる必要があります。
この画像では、各フォルダーに2つのブランチと3つのファイルがあります。
したがって、3を2 + 1 = 3 * 3 * 3 = 27ファイルの累乗にする必要があります。
このような構造で1,000,000個以下のファイルを保存するには、各フォルダーに100個のファイルの2つのブランチ(100 * 100 * 100)で十分です。
パラメーターの配列をクラスに渡す必要があります-ツリーが構築されるフォルダーへのパス、フォルダー内のファイルの最大数、ブランチの数、または事前に計算されたファイルの最大数のパターン(パラメーター)を適用できます-bigint、int、mediumint、smallint:
配列( 'upload_dir' => Q_PATH。 '/ uploads /'、 'max_file_count' => 1000、 'branches' => 2、 'pattern' => '')
クラス自体:
<?php
アーカイブでダウンロード上記のソーシャルネットワークのバリアントでは、クラスを2回使用する必要があります。最初にフォルダーのツリーを構築し、次に各フォルダー内のファイルのツリーを構築します。
また、この投稿で「ハードディスク上のファイルの最大許容数」というトピックを省略しました(しかし、知りませんでした)ことにも注意してください。