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


19

ご挨拶、

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

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

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



回答:


12

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

  • FAT:忘れてください:)(OK、制限はディレクトリごとに512ファイルだと思います)
  • NTFS:フォルダーごとに40億個のファイルを保持できますが、比較的急速に劣化します。パフォーマンスの問題に気付くのは1,000前後、数千になり、エクスプローラーがかなりハングしているように見えます。
  • EXT3:物理的な制限は32,000ファイルですが、perfは数千のファイルの後で苦しみます。

  • EXT4:理論的には無限

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


6
これは間違っています。EXT3には32000ファイルの制限はありません。32000サブディレクトリの制限があります。ここには300000を超えるファイルを含むディレクトリがあり、正常に動作します。
davidsheldon

1
本当です-ファイルの制限はiノードのファイルシステム全体の制限ですが、32kリンク(つまり、サブディレクトリ)に制限されています。
gbjbaanb

現在のNTFSの記述も正しくありません。最大4,294,967,295(2 ^ 32-1)まで保持できます:technet.microsoft.com/en-us/library/cc781134%28WS.10%29.aspx
Fleshgrinder

サブディレクトリとファイルを混同しないでください。CentOSマシンでは、32000個のサブディレクトリがあり、制限に達しました。その1つのディレクトリ内のすべてのファイルを移動しても正常に動作します。
adrianTNT


8

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

唯一の欠点は、新しいサーバーを2番目のサーバーと同期するために、rsyncディレクトリ全体で実行する必要があることです。また、最新の1,000程度を含むサブディレクトリを同期するように指示することができません。


さて、2番目のサーバーと同期するには、変更を保持する構造とアルゴリズムを作成する必要があると思うので、このログで時間を大幅に節約できます。
バハディールタスデミール

+1これは実際に質問に答えます。
クバンチク

1つの欠点は、FileZillaのようなFTPクライアントを使用していて、フォルダーのコンテンツをリストしたい場合、しばらく時間がかかります。
カイノアック

3

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

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


しかし、ファイルに直接アクセスすると、ディレクトリを検索する際のボトルネックが取り除かれますか、それとも直接アクセスしても、基礎となる検索呼び出しがありますか?(Linux、Debian)
スティーブ

3
ファイルに直接アクセスすると、これらの問題が軽減されます。ext3でテストを行ったところ、500000個のファイルを含むディレクトリ内のファイルに名前でアクセスするのlsは、1000個のファイルを含むものよりも大幅に遅くなることはありません。
davidsheldon

正確な名前がわかれば、アクセスは高速になります。問題は、ほとんどの場合、ファイルのリストを取得するコードまたはコマンドです。
ウィムテンブリンク10

1

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


0

@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/

1
ありがたいことに、ディレクトリに2k個を超えるファイルがあると、間違いなく何かが配置されます。:)
スティーブ

この質問は、いくつかの良い答えを持っている: serverfault.com/questions/95444/...
デイビー

私の一般的な経験則では、ディレクトリ内の約20,000を超えるファイルはお勧めできません。最新のファイルシステムのほとんどは、その数のファイルで問題ありません。ディレクトリで32k個のファイルにヒットすると、ext3などの一部のファイルシステムで深刻なパフォーマンスの問題が発生し始めます。
フィルホレンバック

Phil-ext3を使用した32kを超えるファイルのパフォーマンスの問題に関する情報はありますか。現時点では300kを超えるファイルは表示されていません。
davidsheldon

私の以前の仕事では、科学ソフトウェアはディレクトリに多数の小さな(それぞれ数k)ファイルを生成していました。32kを超えるファイルの場合、ディレクトリの読み取り時間が大幅に増加することは間違いありません。その数のファイルがあるディレクトリで「ls」を実行するだけで、1分以上かかります。
フィルホレンバック

0

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

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

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


0

NTFS(Windows 7、64ビット)の10Kファイルを含むフォルダーをチェックしました。任意のビュー(リスト、アイコンなど)に10K画像が含まれるフォルダーは、実用的な遅延なしに機能し、スクロールします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.