web-dev-qa-db-ja.com

ディレクトリ内のファイルの数が多すぎますか? (ネットからデータをダウンロード)

ご挨拶、

さまざまな写真のWebサイトからの画像を処理するスクリプトをいくつか書いています。現在、このすべてのデータを同じディレクトリの個別のテキストファイルに保存しています。

ディレクトリはWebアクセス可能です。エンドユーザーは、ユーザーが必要とするファイルへのパスを返すWebサービスを呼び出します。

これらのすべてのファイルを同じディレクトリに置くと、どの段階でパフォーマンスに影響があるのでしょうか。 (もしあれば)

19
steve

パフォーマンスは、使用しているファイルシステムによって異なります。

  • FAT:忘れてください:)(OK、制限はディレクトリあたり512ファイルであると思います)
  • NTFS:フォルダごとに40億のファイルを保持できますが、パフォーマンスの問題に気づき始める数千、数千の場合、エクスプローラはかなりハングアップしているように見えます。
  • EXT3:物理的な制限は32,000ファイルですが、パフォーマンスも数千ファイル後に低下します。

  • EXT4: 理論的には無制限

  • ReiserFS、XFS、JFS、BTRFS:より近代的で、多くのファイルを処理するように設計されているため、ディレクトリ内の多くのファイルに適しています(他は、HDDがGBではなくMBで測定された時代に設計されました)。 。多くのファイル(ext4を含む)のパフォーマンスは、どちらもバイナリ検索タイプのアルゴリズムを使用して目的のファイルを取得するため(他のファイルはより線形なものを使用するため)、はるかに優れています。

12
gbjbaanb

私はWebサーバーで提供するための画像を保存しており、EXT3の1つのディレクトリに300,000を超える画像があります。パフォーマンスの問題はありません。これを設定する前に、ディレクトリ内の500kのイメージを使用してテストを行い、名前でファイルにランダムにアクセスしました。ディレクトリ内の500kを超えるイメージで500kを使用しても大きな速度低下はありませんでした。

私が目にする唯一の欠点は、新しいものを2番目のサーバーと同期するために、ディレクトリ全体に対してrsyncを実行する必要があることであり、最新の1000を含むサブディレクトリを同期するように指示することはできません。とか、ぐらい。

8
davidsheldon

フォルダー内のファイルの量は、理論的には無制限である可能性があります。ただし、OSが特定のフォルダーにアクセスしてファイルを検索するたびに、フォルダー内のすべてのファイルを処理する必要があります。ファイルが500未満の場合、遅延に気付かない場合があります。ただし、1つのフォルダーに数万のファイルがある場合、単純なフォルダーリストコマンド(lsまたはdir)は時間がかかりすぎる可能性があります。これらのフォルダーにFTP経由でアクセスできる場合、本当に遅くなります...

パフォーマンスの問題は、実際にはOSに依存しませんが、システムプロセッサの速度、ディスク容量、メモリに依存します。それだけ多くのファイルがある場合は、それらを1つのアーカイブに結合し、大量のデータを保持するように最適化されたアーカイブシステムを使用できます。これはZipファイルでもかまいませんが、ファイル名を主キーとしてデータベースにblobとして保存することをお勧めします。

3
Wim ten Brink

私の経験則では、1000を超えるファイルがある場合はフォルダーを分割し、フォルダーが(つまり、インターネットまたはエクスプローラー経由で)参照されるか、それ以外の場合は5000ファイルが参照されます。

1
Beep beep

NTFS(Windows 7、64ビット)で10Kファイルを含むフォルダをチェックしました。すべてのビュー(リスト、アイコンなど)に10Kの画像が含まれているフォルダーは、遅延を伴うことなく機能し、スクロールします。

0
Vil

ファイルに直接アクセスしている場合、ディレクトリ内のファイルの数は速度の問題ではありません。

1つのディレクトリに作成できるファイルの数は、使用しているファイルシステムによって異なります。ディレクトリ内のすべてのファイルを一覧表示する場合や、検索、並べ替えなど、多くのファイルがある場合、これらの操作が遅くなります。

gbjbaanbは、ext3の最大ファイルサイズに関する彼の答えが間違っています。一般に、extは一般的にディスク上のファイル数を制限します。 iノードテーブルにiノードがある場合、これ以上ファイルを作成することはできません。彼は多くのファイルでより多くのパフォーマンスのためにreiserfsを提案することで正しいです

0
Janusz

@skaffmanが指摘するように、制限はオペレーティングシステムによって異なります。古いOSの制限の影響を受ける可能性があります。古いバージョンのSolarisでは、ディレクトリあたり32768ファイルに制限されていたことを覚えています。

通常の解決策は、ある種のハッシュを使用することです。つまり、Cyrus imapサーバーはアルファベットのハッシュによってユーザーを分割します。

/var/spool/imap/a/user/anna/
/var/spool/imap/a/user/albert/
/var/spool/imap/d/user/dan/
/var/spool/imap/e/user/ewan/
0
diciu