web-dev-qa-db-ja.com

ディレクトリにファイルを保存しています...制限はありますか?

CentOS5とPlesk9(64ビット)を使用しています。ユーザーが写真をアップロードするサイトを運営しています。 64ビットOSの場合、保存できるファイルの数に制限はありますか?私が気にしているのは、パフォーマンスとファイルの提供だけです。散在するファイルの深さに4つのディレクトリを持たせたくありません。しかし、いつか20万から30万枚の画像ができることを願っています。

3
Mike Curry

もしあなたが ext3を使って なら、私は この引用 (警告:スペイン語を話すサイト)を見つけました

「1つのディレクトリに32k(32768)のサブディレクトリの制限があります。多くの人がそれほど多くのファイルを持っていないため、学術的な関心だけの制限である可能性があります(ただし、巨大なメールサーバーはそれを覚えておく必要があるかもしれません)。 ext2 inode仕様では、100兆を超えるファイルを1つのディレクトリに配置できます。」

さらに読む ext3には32Kの制限がないことを示しましたこれは経験的に証明できます

a=0; i=1; while [ $a == 0 ]; do touch $i; a=$?; let i++; done

しかし、それはフォルダに32Kのフォルダ制限があります、これはでテストすることができます

a=0; i=1; while [ $a == 0 ]; do mkdir $i; a=$?; let i++; done

この(根拠のない)主張

ReiserFSは、1つのディレクトリに数十万のファイルがあるのでまったく問題ありません。 flabdablet- 2007年2月1日

この質問 姉妹​​サイトstackoverflow.comからも役立つ可能性があります。

一般に:

  • ディレクトリの数には制限があります
  • あなたはあなたのファイル/ディレクトリを32K以下に保つべきです、しかし行くことができますさらに、
  • 使用しているファイルシステムは重要です。
6
voyager

数百枚の画像を超える場合は、必ず2つのことを考慮してください。

  1. ハッシュされたファイル名を持つネストされた階層。
  2. Ext3を使用しない

XFSを使用することをお勧めします。それができない場合は、2バイトのペアで分割された2つまたは3つの深さのディレクトリ階層を持つReiserFSを使用することをお勧めします。例えば.

11/2f/112f667c786eac323e300632b5b2a78d.jpg
49/2f/49ef6eb6169cc57d95218c842d3dee5c.jpg
0a/26/0a26f9f363f1d05b94ceb14ff5f27284.jpg

これにより、最初の数レベルで256個のディレクトリが作成され、画像が合計65535個の個別のディレクトリに分割されます(これは、100〜200k以上の画像には十分すぎるほどです)。これにより、物事がはるかに高速でスケーラブルになり、後で保守するのもはるかに簡単になります。

1
Dan Udey

これは、オペレーティングシステムの64ビットではなく、使用しているファイルシステムによって異なります。すべてのファイルシステムで、ディレクトリの検索に使用されるアルゴリズムのビッグオーのコストがコンピュータをより良くするポイントがあります。

ファイル階層を2層の階層に分割できれば、長期的なスケーラビリティが向上します。

1
Evan Anderson

Linuxのファイルシステムは、基本的に2つの方法でディレクトリを保存します。

  1. ファイルのフラットリストとして。

  2. データ構造として(通常はB + Treeまたは関連するデータ構造)。

前者は、ファイルが追加されるにつれて次第に遅くなります。後者はそうではありません。 lsは、これらすべてのファイルのiノードを検索する必要があるため、まだ永遠にかかる可能性があることに注意してください。ディレクトリエントリには、ファイル名とiノード番号のみが含まれます。

Ext3ディレクトリはフラットリストであり、ハッシュ化されたツリーインデックスを使用して処理を高速化するオプションがあります。

XFSはB + Treesを使用します。

ただし、これらのファイルシステムのいずれかで、ls -lを実行すると、ファイルと同じ数のiノードをヒットする必要があります。名前の検索(ファイルを開くときなど)の場合、B + Treeなどは、大きなディレクトリの場合にはるかに高速になります。

ただし、ディレクトリの階層によりファイルの管理が容易になるため、その可能性を検討することをお勧めします。たとえば、4000個のファイルがそれぞれに制限されているディレクトリの単一層でさえ、管理がはるかに簡単になります。

Ext3のほとんどのデフォルト構成には制限がありますディレクトリあたり32Kのサブディレクトリ(現在実際の数を思い出せませんが、数週間前にシステムがDebian/Etchであったときにその問題に遭遇しました)。

また、多くのキャッシュを使用する一部のアプリケーションでも影響を受ける可能性があります。

0
serverhorror

確かに、ext3を使用しないnotを検討してください。 http://kernelnewbies.org/Ext4#head-97cbed179e6bcc48e47e645e06b95205ea832a68 (ext4の新機能を示しています)は、出発点として役立つかもしれません。

1つのディレクトリ内の多くのファイルを維持するのが難しい場合があるため、squidがキャッシュ(ディレクトリの複数のレイヤー)をどのように編成するかを見てみましょう。長いリストは(一般的に)最悪です。

0
Tom Newton

ext3ファイルシステムには、ほとんどのディストリビューションでデフォルトで大きなディレクトリ用のhtreeがあります。 tune2fs -l /dev/sda1(または使用しているブロックデバイス)を選択し、「ファイルシステム機能:」の行を確認します。それらの中に「dir_index」がある場合、あなたは金色です。

ただし、最高のディレクトリ構造でも、特定のファイルを1つだけすばやく見つけることができることに注意してください。巨大なディレクトリでlsを実行すると、単一のファイルに一致することがわかっている場合でも、パターンマッチングと同様に、ひどいことになります。

これらの理由から、通常は1つまたは2つのレベルのディレクトリを追加することをお勧めします。通常、IDのいくつかのビットを使用してディレクトリに名前を付けます。

0
Javier

Linuxサーバーで使用しているファイルシステムによって多少異なります。

Dir_indexでext3を使用していると仮定すると、大きなディレクトリを非常に高速に検索できるはずなので、速度はそれほど問題にはなりません。リストは(明らかに)時間がかかります。

ディレクトリに入れることができるファイルの最大数については、最大32,000ファイルまで確実に作業できると確信しています。それを超えたいかどうかはわかりません(おそらく可能ですが)。

0
KPWINC