ファイルストレージ

最近、ファイルシステムに大量の情報を保存するサイトを積極的に使用する必要がありました。 これらは、さまざまな写真およびファイルホスティングサイト、およびビデオコンテンツをダウンロードするサイトです。一部のサイトは私がゼロから設計およびプログラミングし、一部はコピー、追加、または「整理」しました。

ファイルシステムにファイルを保存することは、多くのプログラマが注意を払う領域であることに注意してください。

始めるために、一般的なエラーの簡単な概要を示します。

1.ファイルはキリル文字でファイルシステムに保存されます。 実際には、次のことが起こります。ユーザーが「nameless-1.jpg」などの名前でファイルをアップロードし、同じ名前のプログラマーがファイルが保存されているディレクトリにプッシュします。 これに伴う問題を説明する必要はありませんか?

2.ファイルはユーザーがダウンロードした名前と同じ名前で保存されますが、ラテンアルファベットに含まれていない文字は音訳されます。 すでに優れていますが、それでもこの方法は多くの問題を引き起こします。たとえば、ユーザーは同じ名前のファイルをアップロードするのが好きです)))そして、それは彼らがそれほど邪悪なわけではありません、たとえば、私のカメラはメモリカードをクリーニングするたびに00001から写真に番号を付け始めます。

そして3番目によくある間違い:

3.ファイルシステムの能力を超えるファイルの数をディレクトリに保存します。 特定の例を使用してこの状況を考えてみましょう。ファイルホスティングを書き換えていました。書き換え時の大量の情報は4テラバイトに近く、ファイルの80%が写真であったにもかかわらずです。 ディスク上のすべてのファイル(それぞれ4テラバイトのディスクがありました)は、ダースのディレクトリにランダムに散らばっていました。ディスクがいっぱいになるまで、プログラムは次のディスクに移動しました。 その結果、Webサーバーはディレクトリを開くのに約3秒かかりました。 同意します、これは壊滅的にたくさんあります。 ディスク上の各ディレクトリには約2万個のファイルがありました。

このような状況をいくつか分析した後、次の条件を満たすファイルを保存する方法を推測しようとしました。

1.ディレクトリの速度が低下しないようにします。つまり、1つのディレクトリに1000個を超えるファイルまたはディレクトリを格納しないでください(この数値は余裕を持って取得されます)。

2.ファイル名は繰り返さないでください。

3.同じファイルのコピーを2つ保存しないことをお勧めします。

少し考えた後、次のスキームに行きました。それを仲間のプログラマーと共有したいと思います。

ファイルの2つのコピーを保存しないという最後の要件から始めます。 ファイルの整合性を判断するために、phpのmd5ハッシュは長い間使用されており、MD5 RSA Data Security、Inc.アルゴリズムを使用してファイル名引数で指定された名前のファイルのMD5ハッシュを計算するmd5_file(filename)関数によって解決されています このハッシュを返します。 ハッシュは32桁の16進数です。

2つのファイルが同じであり、ハッシュが同じである場合、それらが異なる場合は異なります。 さて、md5の衝突と不安定性についての議論を伴う「石が飛ぶ」。 md5が信頼できないという順番で答えますか? しかし、「可能性のある敵」を欺くタスクを設定しません! 一意のファイル識別子を取得するだけです。 そして衝突について...私は自分の方法を1対1で繰り返すことを主張せず、別の関数を使用します。 考えてみてください、2〜256度はたくさんです! 彼らが衝突の可能性について教えてくれるなら、私は2行または2つのファイルの例、同じmd5ハッシュを与えるように人に頼む...これまでのところ、私はそのようなペアを与えられていないので、可能性は純粋に理論的です。

ポイント2-「ファイル名は繰り返さないでください。3番目から直接続きます。 md5ハッシュの文字列をディスク上のファイルの名前として使用する場合、ファイル名は繰り返されません(実際のファイル名(ユーザーがアップロードしたもの)はデータベースに保存できます)。 ユーザーが2つの同一のファイルをダウンロードすると、それらから同じ名前が付けられます。 そして最初-ファイルは複製されません、2番目-ディレクトリ内の名前については心配しません。

ディスク上のファイルの保存についてもう少し複雑になりました。 ファイル名に基づいてサブディレクトリ構造を作成します。 想像力の完全な範囲もあります。 決して、メソッドを盲目的にコピーすることをお勧めしません。 通常、2、3レベルのディレクトリネストを行います。 最初のレベルは、ファイル名の最初の2文字です(忘れないでください、ファイル名はmd5ハッシュです!)。 2番目のレベルは3番目と4番目の文字です...

ネストレベルごとに* 256個のディレクトリが提供されます。

つまり、1つのディレクトリにアップロードできるファイルが1000を超えない場合、1つのネストレベルで256,000個のファイルをディスクに安全に配置できます。 2レベルのネスト-65 536 000; 3つ-16,777,216,000など。 md5ハッシュ行の長さにより、ディレクトリに16レベルのネストを作成できます。 私の意見では、これは最も容量の大きいドライブの動作を保証するのに十分です。 ただし、実践に基づいて、通常、複雑なプロジェクトには「目のため」に3つのレベルで十分です。

PS 更新および拡張バージョン(議論に基づいて作成)



All Articles