1つのフォルダーに多数(1,000万)のファイルを配置する


17

Ubuntuサーバーで実行するサイトに予測検索機能(下の例を参照)を追加しました。これは、データベースから直接実行されます。各検索の結果をキャッシュし、存在する場合はそれを使用し、存在しない場合は作成します。

潜在的なcira 1000万の結果を1つのディレクトリ内の個別のファイルに保存しても問題はありますか?または、フォルダに分割することをお勧めしますか?

例:


5
分割する方が良いでしょう。そのディレクトリの内容を一覧表示しようとするコマンドは、おそらく自分自身を撃つことにします。
ムル

8
既にデータベースを持っているなら、それを使用してみませんか?DBMSは、ファイルシステムよりも数百万のレコードをより適切に処理できると確信しています。ファイルシステムの使用に夢中になっている場合は、何らかのハッシュを使用した分割スキームを考え出す必要があります。この時点では、DBを使用すると作業が少なくなるようです。
roadmr

3
モデルに適したキャッシングの別のオプションとして、memcachedまたはredisがあります。これらはキーバリューストアです(したがって、単一のディレクトリのように機能し、名前だけでアイテムにアクセスします)。Redisは永続的であり(再起動してもデータは失われません)、memcachedは一時的なアイテム用です。
スティーブンオステルミラー

2
ここには鶏と卵の問題があります。ツール開発者は、多くのファイルが含まれるディレクトリを処理しません。人々がそうしないからです。また、ツールが十分にサポートしていないため、多数のファイルを含むディレクトリを作成しません。例えば、私はかつて理解しています(そして、これはまだ真実であると信じています)がos.listdir、Pythonのジェネレーターバージョンを作成するための機能要求は、この理由で完全に拒否されました。

私自身の経験から、Linux 2.6の単一のディレクトリで32kファイルを超えると破損が見られました。もちろん、このポイントを超えて調整することは可能ですが、お勧めしません。サブディレクトリのいくつかのレイヤーに分割するだけで、はるかに改善されます。個人的には、ディレクトリごとに約10,000に制限します。これにより、2つのレイヤーが得られます。
ウォルフ

回答:


25

1つのディレクトリ内の個別のファイルに約1,000万件の結果を保存することに問題はありますか?

はい。おそらくもっと多くの理由がありますが、これらは私の頭上から投稿できます:

  • tune2fsというオプションdir_indexがあり、デフォルトで有効になる傾向があり(Ubuntuでは)、パフォーマンスが低下する前にディレクトリに約10万個のファイルを保存できます。それは、あなたが考えている10mファイルにさえ近くありません。

  • extファイルシステムには、固定最大数のiノードがあります。すべてのファイルとディレクトリは1つのiノードを使用します。df -iパーティションとiノードを無料で表示するために使用します。iノードが不足すると、新しいファイルやフォルダを作成できません。

  • などのコマンドはrmlsワイルドカードを使用するときにコマンドを展開し、「引数リストが長すぎます」で終了します。findファイルを削除または一覧表示するために使用する必要があります。そしてfind、遅くなる傾向があります。

または、フォルダに分割することをお勧めしますか?

はい。確実に。基本的に、1つのディレクトリに10mのファイルを保存することさえできません。

データベースを使用します。Webサイト用にキャッシュする場合は、「solr」(「分散インデックス作成、複製、および負荷分散クエリの提供」)をご覧ください。


8

同じ問題で終わった。独自のベンチマークを実行して、すべてを同じフォルダーに配置できるか、複数のフォルダーを使用できるかを確認してください。できるように見え、高速です!

基準

参照:https : //medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28


1
おかげで、これは非常に便利です。私はこれをサイトで使用していますが、この部分を/abc/efg.htmlディレクトリ構造に再プログラムすることは本当の問題です。したがって、将来はフラットディレクトリに戻ります。
コジャブリーズ

0

バイナリ検索は数百万のレコードを簡単に処理できるため、単一のディレクトリを検索しても問題はありません。非常に高速に実行されます。

基本的に、32ビットシステムを使用している場合、2Gbレコードまでのバイナリ検索は簡単で適切です。

オープンソースソフトウェアであるDBは、完全な結果を1つのエントリに簡単に保存し、検索を組み込むことができます。

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