2009-08-28 10 views
2

私はLinuxの32,000サブディレクトリの制限に達しました。それは私のPHPスクリプトに問題を引き起こし、私はそれが再び起こることを望んでいません。非常に大きなディレクトリの情報を取得する

単純な解決策は、別のサブディレクトリを作成する前にPHPスクリプトで現在のサブディレクトリ数を確認することです。

私がこのようなチェックを行うのが見たすべてのアイデアは、ディレクトリ全体を繰り返し、すべてのフォルダを数えます。私の懸念が非常に大きなディレクトリであることを考慮すると、そこに含まれるファイル/フォルダの数を取得するより良い方法はありますか?

ボーナス質問:ディレクトリのディスク使用量を調べる非反復的な方法もありますか?

ありがとうございます! Brian

+1

** du **コマンドはフォルダのディスク使用量を計算しますが、これはおそらくフォルダ全体を検索して実行しますが、PHPで実行できる処理よりも高速です。そして**なぜあなたは32,000のサブフォルダを持っていますか?** –

+4

私はほとんどあなたの本当の問題が32kのフォルダを持っているという事実ですが、その理由はそこにあります。 –

答えて

4

より良い方法は、ディレクトリレイアウトを設計して、1つのディレクトリに32000個のファイルを保存する方法がないことです。実際、ディレクトリ内の1000個のファイルでさえも多すぎることをお勧めします。

私は通常、この問題に取り組むために、ディレクトリ階層の余分なレベルが必要です。典型的な方法は、現在保存しているファイル名を1つのディレクトリに入れ、ネストされたディレクトリに対応する部分に分割することです。だから、あなたは

xyzzy 
foo 
bar 
blah 

のようなファイルの束を持っている場合は、実際にはそうで

x/xyzzy 
f/foo 
b/bar 
b/blah 

として保存してあります。これを複数のディレクトリレベルに拡張するか、複数の文字を使用してサブディレクトリを分割して、このアプローチの深さと幅をトレードオフすることができます。

おそらく、32kファイル制限がないファイルシステムを使用することをお勧めします。個人的には、このようなファイルシステムであっても、私はここで提案しているようなスキームを常に使用します。非常に多数のファイルを持つディレクトリでコマンドラインツールを使って効果的に作業することはほとんど不可能です(lsさえも完全に扱いにくくなります)。この種の手動探査は、開発中、デバッグ中、そして通常は頻繁に必要になります操作。

+0

おっと!私はボーナスの質問に答えるのを忘れていました。「ディレクトリのディスク使用量を見つける非反復的な方法」とは、ディレクトリ内のすべてのファイルのサイズを調べることを含まない方法を意味します。 –

+0

デール - ありがとう。私のアプリケーションでは、各ユーザーがディレクトリを取得する必要があり、32000人以上のユーザーがいます。しかし、極端な例として、私が1,000,000人のユーザーを抱えていたとしましょう。 – Brian

+0

階層のレベルを上げると、保存できる名前の数が指数関数的に増加します。たとえば、1000000は1000平方です。アルファベットのユーザー名を仮定すると、26^2は676、つまり約1000であるため、 "us/er/user1"、 "us/er/user2"、 "xy/zz/xyzzy"、 "pl/ug"/plugh "などがあります。 –

関連する問題