2012-02-17 10 views
4

私はいつでも約40,000人のオンラインの人々とウェブサイトのための基本的なギャラリーをコーディングしています。ユーザーはギャラリーを作成して画像をアップロードすることができます。500.000の画像を保存する最も効率的な方法は何ですか?

私の質問は、ギャラリーごとに別々のフォルダを作成してイメージを置くか、1つのフォルダを作成してすべてのイメージを置いて、データベースの各イメージのgallery_idを保持することですか?または、すべてのユーザー用のディレクトリを作成し、その中にギャラリー名用の別のディレクトリを作成する必要がありますか?

どうすればよいですか?

ps。できるだけ明るくする必要があります。

+1

どのOSとファイルシステムですか? –

+0

Linux。 (Cent OS)私は自分のサーバーへのアクセス権がないので、私はファイルシステムを知らない。 – Aristona

+1

私はamazon s3とそのAPIを使用し、フォルダを保存せず、データベース内のリレーショナルテーブルのみを使用してそれらを追跡することを検討します。 –

答えて

8

私はID でそれらを保存したいと思います。ファイルシステムに依存していて、1つのフォルダにたくさんのファイルがあるとうまく動作しないものもあります。何かを見てください

各ファイルにidを付け、ファイル名の最初の3桁を使用して、それらをフォルダに分割します。 (あなたは100000またはゼロパッドのidであなたの自動インクリメントカウンタを開始するので、少なくとも3つのレベル

/photos/1/0/3/103456.jpg 
/photos/9/4/1/941000.jpg 
/photos/0/0/0/000001.jpg 

あなたは、データベース内のユーザ/ギャラリー/などへの写真の関係を格納することができている可能性があり

それとも、大きな男の子がそれを行う方法

Needle in a haystack: efficient storage of billions of photos

+1

+1これは良い答えですが、IDが一様に広がり、1つのフォルダにたくさんのファイルが残っていないことを確認するために、私の答えで言うようにハッシュ関数を使用することをお勧めします – hackartist

+1

優れた提案。そのように分割することで、将来のパーティション分割が可能になります。たとえば、最初の桁は、ディレクトリではなく、それがどのサーバであるかになります。私は1000万を超える画像を持つサイトを管理しており、同様の設定を使用しています。 –

+0

ありがとう、答えとしてあなたの返信をチェックしてください。 – Aristona

3

を見たい場合、通常のWebサーバは、(あなたは、単一のフォルダに千以上のいくつかのイメージを持ってしたくない私は最近7万に対処しなければなりませんでしたイメージはsupeを引き起こすあなたが何千もの画像を持っていると思うならば、確かに単一のフォルダではありません。最高の解決策は、CDN CloudFrontに接続されたamazonのS3をホストすることですが、それが現実的でない場合は、自分のサーバー上でいくつかのことをやり続けることができます。

ギャラリーごとに別々のフォルダを作成します。ギャラリーの大きさの範囲を知っていて、作成するギャラリーの数を知っている場合にのみ、それぞれのギャラリーごとにフォルダを作成してください。 (これは私が今あなたの特定の問題のために示唆しているものです)

ハッシュ関数を使用してイメージ名を入力し、ハッシュの最初の1〜3文字を使用してイメージを置くフォルダに名前を付けます。ハッシュは、画像がフォルダ間でほぼ均等に分割されることを保証し、必要なフォルダの数を決定することができます。

いずれにせよ、実際のパスのギャラリーと画像IDの情報を持つことは、コード内と人間がサーバー上でバグを見つけなければならないときに役立ちます。私はおそらくギャラリーのIDに基づいてフォルダに名前をつけて、ギャラリーに何千もの画像しかないことを確認してください。

0

私はこのような鉱山を格納します。私は後日何かを検査する必要がある場合、私はすぐにユーザーの画像を分離することができます

images/userid/photoid 

この方法です。 1つの中央ディレクトリにそれらをすべて削除するよりも、より組織化されているようです。

関連する問題