2012-01-05 15 views
3

ユーザ入力に基づいてファイル名を圧縮するbashスクリプトがあります。私は時々、最大50Kのファイルを解析するので、うまく動作しています。検索のパフォーマンスを向上させる

find "$DIR" -name "$USERINPUT" -print | /usr/bin/zip -1 SearchResult [email protected] 

@記号は、zipがSTDINのファイル名を受け入れることを意味します。それを速くする方法はありますか?

私は毎晩ロケートデータベースを更新するためにcronジョブを作成することを考えていますが、私はrootではないので、価値があるとは限りません。

+0

私のセントからセント: 'type -d'は' find'だけフォルダを探すので、原則としていくらか違いがあります。ここで「ジップ」がボトルネックになっているのでしょうか?私は 'tar czf' instedを使ってファイルを圧縮し、性能が良いかどうかを調べるテストを行います。 –

+0

'zip'が問題になる可能性が非常に高いです:データのユーザが厳密にウィンドウユーザであるため、私はそれを選択しました。私は、GZIPやTARがMSウィンドウで何か読めるものを作成できるかどうかはわかりません。任意の入力を歓迎します。 – Chris

+0

ボトルネックが何であるかは分かりません。実際には、ジップとは別にファイルリストを生成し、パイプではなく一時ファイルに入れて、2つのステップを最初にプロファイルする必要があります。次に、各ステップの前後に 'date'を呼び出します。 – mvds

答えて

0

50,000個のファイルのそれぞれについてfindを実行しているファイルシステムを辿っているような音がします。

なぜ、ファイルシステム内のすべてのファイルの名前をログに記録して、ストレートこのログファイルからそれらの場所を摘み取るために、検索のの実行をしませんか?

また、特に複数のファイルシステムと複数のCPUがある場合は、作業を別々のジョブに分割してください。あなたのアプローチでシングルスレッド化する必要はありません。

+2

彼のfind-onelinerは、一致するすべてのファイル名を1つのチャンクに生成し、ファイルごとにzipを起動しません。彼はこのリストを - @引数(STDINからのファイルのリストを取る)と一緒にzipにパイプし、最小の圧縮のために-1を利用する(おそらく試してもNO圧縮の場合は-0)。 –

0

Mattias Ahnbergが指摘したように、findを使用すると、zipが呼び出される前に一致するファイルのリスト全体が生成されます。 50,000以上のファイルを処理している場合は、時間がかかります。呼び出すが一致する各ファイルに自身を圧縮見つけ、この方法で

find "$DIR" -name "$USERINPUT" -exec /usr/bin/zip -1 {} \; 

:おそらく、より適切なアプローチがfind-exec <cmd> {} \;機能を使用することであろう。元のバージョンと同じ最終結果を達成する必要がありますが、ファイルの数がボトルネックである場合(ファイルがすべて小さい場合は可能性が高い)、一致するファイルを見つけるとすぐに実行中のzipを開始しますすべての一致が見つかったときではなく、

注:このオプションの詳細については、findのmanページをお読みください。セミコロンはエスケープして、シェルが見つけ出すのではなく、シェルを解釈しないようにする必要があります。

1

xargsコマンドで並列処理を使用してプロセス全体を高速化することをお勧めします。

find "$DIR" -name "$USERINPUT" -print0 | xargs -0 -P10 zip -1 SearchResult [email protected] 

上記のコマンドを実行すると、xargsは10個の並列サブプロセスで実行されます。

このように上記のコマンドのタイミングを記録してください:

time find "$DIR" -name "$USERINPUT" -print0 | xargs -0 -P10 zip -1 SearchResult [email protected] 

、これはパフォーマンスの改善を行っている場合参照してください。

+0

うわー、素晴らしいアイデア。私はそれを刺し、このスレッドを更新します。ありがとうございました。 – Chris

関連する問題