9

多数のファイルを処理し、それらの情報をデータベースに保存するソラリス システムでは (データベースを使用することが、所有しているファイルの数に関する情報を取得する最も簡単な方法であることはわかっています)。ファイルがデータベースに保存される途中でシステムを通過するときに、ファイルを監視するための迅速な方法が必要です。

現在、ディレクトリを配列に読み取り、配列のサイズを取得して監視スクリプトに送信する perl スクリプトを使用しています。残念ながら、システムが成長するにつれて、このモニターはますます遅くなります。

関連するすべてのディレクトリでカウント操作を実行した後、15〜20秒ごとに一時停止して更新するのではなく、はるかに迅速に動作する方法を探しています。

私のボトルネックは、アレイ操作への読み取りディレクトリであることは比較的確信しています。

ファイルに関する情報は必要ありません。サイズやファイル名も必要ありません。ディレクトリ内のファイルの数だけです。

私のコードでは、構成情報を保持するために使用する隠しファイルやテキスト ファイルはカウントしません。この機能が保持されていれば素晴らしいことですが、必須ではありません。

Cコードまたはそれらの行に沿った何かでinodeをカウントすることへの言及をいくつか見つけましたが、私はその分野であまり経験がありません.

私はこのモニターを可能な限りリアルタイムにしたいと考えています。

私が使用するperlコードは次のようになります。

opendir (DIR, $currentDir) or die "Cannot open directory: $!";
@files = grep ! m/^\./ && ! /config_file/, readdir DIR; # skip hidden files and config files
closedir(DIR);
$count = @files;
4

2 に答える 2

10

現在行っていることは、ディレクトリ全体 (多かれ少なかれ) をメモリに読み込み、その内容をカウントのために破棄するだけです。代わりにディレクトリをストリーミングすることでそれを回避します。

my $count;
opendir(my $dh, $curDir) or die "opendir($curdir): $!";
while (my $de = readdir($dh)) {
  next if $de =~ /^\./ or $de =~ /config_file/;
  $count++;
}
closedir($dh);

重要なのは、その形式で使用しないことglob()です。 すべてのエントリglob()が高価stat()になりますが、これは必要なオーバーヘッドではありません。

現在、OS の機能やファイルシステムの機能 (Linux では、inotify を提供しています) によっては、これを行うためのはるかに洗練された軽量な方法があるかもしれませんが、上記のようにディレクトリをストリーミングすることは、移植性を得るのと同じくらい良い方法です。 .

于 2013-07-18T20:35:05.670 に答える