52

大量の写真 (おそらく数万枚) を保存するために、独自の PHP ベースのギャラリーを開発することを考えています。

データベースで画像の URL を指定しますが、ここに問題があります。クロールへのアクセスが遅くなるため、すべての画像をサーバー内の同じディレクトリに配置するのは現実的ではないことがわかっています。それらすべてを保存しますか?jpeg/png の名前に基づいたある種のツリーですか?

画像を分割するためのどのルールをお勧めしますか?

(安っぽいドットコムでの使用に焦点を当てているので、サーバーとの混乱はありません)

4

12 に答える 12

50

過去にも同様の問題がありました。そして素敵な解決策を見つけました:

  • 各画像に一意の GUID を与えます。
  • サブ画像の名前、場所、GUID、可能な場所 (サムネイル、縮小サイズなど) を含む各画像のデータベース レコードを作成します。
  • GUID の最初の (1 つまたは 2 つの) 文字を使用して、トップレベルのフォルダーを決定します。
  • フォルダーにファイルが多すぎる場合は、再度分割します。参照を更新すると、準備完了です。
  • ファイル数とアクセス数が多すぎる場合は、フォルダーを複数のファイル サーバーに分散させることができます。

ガイドを使用すると、多かれ少なかれ均一な分割が得られることを経験しました。そして、それは魅力のように機能しました。

一意の ID を生成するのに役立つリンク:

于 2009-01-15T11:18:07.640 に答える
11

私は数年前に電子文書管理システムに取り組み、Gamecat と wic が提案したことのほとんどを実行しました。

つまり、各画像に一意の ID を割り当て、それを使用して画像ファイルへの相対パスを取得します。wic が提案したものと同様の MOD を使用しましたが、3 レベルの各レベルで 1024 個のフォルダー/ファイルを許可したため、1G ファイルをサポートできました。

ただし、ファイルから拡張子を削除しました。DB レコードには MIME タイプが含まれていたため、拡張子は必要ありませんでした。

完全な URL を DB レコードに保存することはお勧めしません。画像 ID のみを保存することをお勧めします。URL を保存すると、DB を変換せずにストレージを移動または再構築することはできません。少なくとも画像リポジトリを移動できるため、相対 URL は問題ありませんが、ID を保存して URL を導出するだけでより柔軟になります。

また、Web から画像ファイルへの直接参照を許可することはお勧めしません。代わりに、サーバー側プログラム (Java サーブレットなど) に URL を提供し、イメージ ID を URL クエリ ( http://url.com/GetImage?imageID=1234) で提供します。

サーブレットはその ID を使用して、DB レコードの検索、MIME タイプの決定、実際の場所の取得、セキュリティ制限の確認、ログ記録などを行うことができます。

于 2009-01-15T13:07:20.400 に答える
9

私は通常、数値のデータベース ID (auto_increment) を使用してから、modulu (%) 演算子を使用してファイルを配置する場所を見つけます。シンプルでスケーラブル。たとえば、ID 12345 のイメージへのパスは次のように作成できます。

12345 % 100 = 45
12345 % 1000 = 345

で終わる:

/home/joe/images/345/45/12345.png

またはそのようなもの。

Linux と ext3 とファイルシステムを使用している場合は、ディレクトリと、ディレクトリに含めることができるファイルの数に制限があることに注意する必要があります。ディレクトリの制限は 32000 であるため、ディレクトリの数を常に低く抑えるように努める必要があります。

于 2009-01-15T12:38:02.737 に答える
7

クロールへのアクセスが遅くなるため、サーバー内の同じディレクトリにそれらすべてを配置することは実際的ではありません。

これは仮定です。

私は、何百万ものファイルを 1 つのディレクトリにフラットに格納するシステムを設計しましたが、うまく機能しました。また、プログラミングが最も簡単なシステムでもあります。ほとんどのサーバーファイルシステムはこれを問題なくサポートしています (ただし、使用しているファイルシステムを確認する必要があります)。

http://www.databasesandlife.com/flat-directories/

于 2010-08-18T09:58:19.063 に答える
6

auto_increment ID に関連付けられたファイルを保存する場合、次のようなものを使用します。これにより、それぞれ 1000 個のディレクトリで構成される 3 つのディレクトリ レベルと、各第 3 レベルのディレクトリに 100 個のファイルが作成されます。これは、最大 1000 億のファイルをサポートします。

$id = 99532455444 の場合、次は /995/324/554/44 を返します

function getFileDirectory($id) {
    $level1 = ($id / 100000000) % 100000000;
    $level2 = (($id - $level1 * 100000000) / 100000) % 100000;
    $level3 = (($id - ($level1 * 100000000) - ($level2 * 100000)) / 100) % 1000;
    $file   = $id - (($level1 * 100000000) + ($level2 * 100000) + ($level3 * 100));

    return '/' . sprintf("%03d", $level1)
         . '/' . sprintf("%03d", $level2)
         . '/' . sprintf("%03d", $level3)
         . '/' . $file;
}
于 2010-07-28T19:50:57.493 に答える
2

XFS ファイルシステムを見てください。無制限の数のファイルをサポートし、Linux はそれをサポートします。 http://oss.sgi.com/projects/xfs/papers/xfs_usenix/index.html

于 2009-12-10T12:26:08.097 に答える
1

私は現在この問題に直面しており、Isaac が書いたものに興味を持ちました。私の機能は少し異なります。

function _getFilePath($id) {
    $id = sprintf("%06d", $id);
    $level = array();
    for($lvl = 3; $lvl >= 1; $lvl--)
        $level[$lvl] = substr($id, (($lvl*2)-2), 2);
    return implode('/', array_reverse($level)).'.jpg';
}

私の画像は数千枚しかないので、これは最大 999999 の制限しかないので、99/99/99.jpg または 43524 を 04/35/24.jpg に分割します。

于 2011-03-05T00:39:59.073 に答える
1

常にテーブルに DateTime 列があり、テーブルに追加された画像の月、年、または月、日、年にちなんで名付けられたフォルダーにそれらを保存できます。

  1. 2009年
  2. -01
  3. --01
  4. --02
  5. --03
  6. --31

この方法では、最終的に 3 つ以上のフォルダーの深さはなくなります。

于 2009-01-15T11:41:58.250 に答える
0

ファイル システムの階層を使用します。001/002/003/004.jpg のようなものを使用して画像を識別すると、非常に役立ちます。ただし、パーティショニングは別の話です。ランダム、コンテンツベース、作成日ベースなどの可能性があります。実際には、アプリケーションが何であるかによって異なります。

于 2009-01-15T11:02:01.590 に答える
0

マルチメディア コンテンツを格納するために Apple iPod で使用されている戦略を確認できます。1 レベルの深さのフォルダーと同じ幅のタイトルのファイルがあります。Apple の担当者はソリューションのテストに多くの時間を費やしたので、すぐにメリットが得られると思います。

于 2009-01-15T11:05:30.507 に答える
0

扱っている写真がデジタル写真の場合は、EXIF データを使用して、撮影日などで並べ替えることができます。

于 2009-01-15T11:30:45.527 に答える
0

イメージを BLOB としてデータベースに格納できます ( mssql の場合はvarbinary )。そうすれば、ストレージやディレクトリ構造について心配する必要はありません。唯一の欠点は、ファイルを簡単にブラウズできないことですが、バランスのとれたディレクトリ ツリーではそれは難しいでしょう。

于 2009-01-15T11:35:54.517 に答える