Mac OS Xのディレクトリに多くのファイルを置くことに対する制限はありますか?


9

MacOS Xのディレクトリに100,000以上のファイルがあり、スクリプトがそれらのファイルを読み取るのが遅いようです。

それだけ多くのファイルを作成するための制限や推奨事項はありますか?それらをいくつかのディレクトリに分割する必要がありますか?

私が見つけた制限は、mv * foo100,000のファイルすべてに対応できるわけではないということでした。「引数が長すぎます」というエラーが表示されます。約20,000ファイル未満で動作します。


現在、ディレクトリに380,000個のファイルがあり、ファイルを開く場合でも、10秒以上かかることを認識しています。それらをいくつかのディレクトリに分けることにしました。
Daisuki Honey

1
HFS +ファイルシステムは、ディレクトリ内の多数のファイルを、フルネームで、あまり問題なく保存およびアクセスできる必要があります。ただし、ワイルドカードに注意する必要があります。コマンドの引数の一部として、*または?コマンドの引数として使用すると、オペレーティングシステムはディレクトリ全体を検索して一致するファイルを探し(低速)、引数をすべての一致するファイルのリスト(長い)で置き換えます。コマンド。あなたは、ループまたは数mVのコマンド、例えば、ともっと良いかもしれませんmv a* foo && mv b* foo
マティアスフリップ2016年

回答:


1

このスタックオーバーフローの回答Appleのサイトの具体的な詳細によれば、個々のフォルダーには最大21億個のアイテムを含めることができます。

とはいえ、最大21億個のアイテムを保持できるからといって、そのレベルでパフォーマンスを維持できるわけではありません。ウィキペディアによると、強調は私のものです:

すべてのファイルとディレクトリレコードを単一のデータ構造に保存するカタログファイルは、システムがマルチタスクを許可している場合、一度に1つのプログラムしかこの構造に書き込むことができないため、多くのプログラムがキューで待機している可能性があるため、パフォーマンスの問題が発生します。 1つのプログラムがシステムを「占有」するため。このファイルへの損傷はファイルシステム全体を破壊する可能性があるため、これは深刻な信頼性の問題でもあります。

したがって、カタログファイルは一度に1つのプログラムでしか使用できないという事実により、パフォーマンスは当然低下します。また、ディレクトリのサイズが大きくなると、その問題によって引き起こされるリスク/機能低下がエスカレートするだけです。ファイルが多いほど、プログラムがその1つのディレクトリ内のファイルにアクセスできる可能性が高くなります。ここでそのアイデアをさらに確認します。再び強調は私のものです:

カタログファイルは複雑な構造です。すべてのファイルとディレクトリ情報を保持するため、ファイルシステムのシリアル化を強制します。ファイルI / Oを実行したいスレッドが多数ある場合は、理想的な状況ではありません。HFSでは、ファイルを作成したり、何らかの方法でファイルを変更したりする操作では、カタログファイルをロックする必要があります。これにより、他のスレッドがカタログファイルへの読み取り専用アクセスすらできなくなります。カタログファイルへのアクセスは、シングルライター/マルチリーダーである必要があります。


本当にありがとう。カタログファイルへのアクセスがボトルネックになり、特にマルチタスクの場合に深刻なパフォーマンスの問題を引き起こす可能性があることを理解しています。
Daisuki Honey

@DaisukiHoneyどういたしまして!だから私の答えが役に立ったと思ったら、必ず投票してください。そして、それがあなたの問題を解決した答えであった場合、そのようにそれをチェックすることを忘れないでください。
JakeGould 2014年

はい、間違いなく私はあなたの答えに投票してチェックします。繰り返しますが、どうもありがとうございました。
Daisuki Honey

あなたが引用ウィキペディアのセクションでは、ファイルシステムごとに、ないディレクトリごとのスケーラビリティの制限について話している。そこにファイルシステムごとに1つだけのカタログファイルであり、すべてのアクセスは、その上でシリアル化する必要があります。質問とはまったく関係ありません。
poolie 16

@poolie問題は、ファイルシステムに存在するディレクトリごとです。カタログファイルはファイルシステムごとに存在しますが、ディレクトリ自体も同じファイルシステムに存在します。これは、単一のファイルシステムに存在するディレクトリ内の10,000以上のファイルを扱う質問に関連しています。しかし、この質問は2年以上前のものなので、Wikiリンクに感謝します。回答を更新して、新しい文言と問題のセクションへの直接リンクを含めました。
JakeGould 2016

4

短い回答:ええと、100,000個のファイルを読み取っている場合は、スクリプトが遅いと思うかもしれません。

長い答え:この質問にもっと完全に答えるには、Macのファイルシステムを調べる必要があります。MacはHFS +(Hierarchical File System Plus)を使用します。これは、制限がありますが、極端な状況でのみ使用できる最新のファイルシステムです。

私の経験から、それはLinux EXTジャーナリングファイルシステムによく似ています。このソースによると、マウントディレクトリ、UNIXライクなアクセス許可などをサポートしています。32ビット形式のファイルに対処し、ボリュームに保存できるファイルの最大数を4,294,967,295にしています。

ここで説明するように、ファイルシステムは、最新のシステムでは8 EBを超えるファイルと、1つの場所に最大21億個のファイルとフォルダーで壊れ始めます

HFS +(または実際にはすべてのファイルシステムがセットアップされている)の方法を考えると、フォルダーに多くのファイルを置いても、「奇妙な」ことはありません。

正直なところ、ファイルをより複雑なフォルダー階層に分散することでパフォーマンスが向上することはないと思います。実際には、スクリプトがプロセスの途中でディレクトリを変更するための呼び出しを行う必要があるため、この手法は効率が悪くなる可能性があります。


正しい。ディレクトリ階層を変更することを考えましたが、アルゴリズムがより複雑になり、パフォーマンスが大幅に向上したと思います。答えてくれてありがとう。現在、ディレクトリには200,000個のファイルがあり、最後に1,000,000個になる可能性があります。私はそれがその悪いパフォーマンスなしでうまく動くことを望みます。
Daisuki Honey

@DaisukiHoneyこれだけ多くのファイルで作業している場合、物をディレクトリに分割できるかどうかを確認することは価値があります。この段階では難しいかもしれませんが、前進することで少し安定するかもしれません。
JakeGould 2014年

@JakeGouldアドバイスありがとうございます。さらにファイルを追加する可能性があるため、再構築を検討しています。ありがとう。
Daisuki Honey
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.