2017-01-16 8 views
1

私は2つのメインファイルサーバと大きなバックアップサーバを持っていますが、誰かがバックアップサーバを誤って整理してしまっているので、バックアップサーバにファイルがないことを確認する必要があります。メインサーバー上でファイルサイズ/名前を比較するコードを高速化するにはどうすればよいですか?

Rubyには、各ドライブのすべてのファイルのリスト(File.globを使用して見つかったもの)のリストを使用して、メインドライブ上のファイルの有無をチェックするクイックコードを記述したいと思っていました。 File.sizeおよびFile.basename。

問題は時間がかかります!メインドライブとメインドライブとの間の各ファイルは、バックアップドライブと比較してそれぞれ約0.8秒かかり、数十万のファイルを含むドライブがあると、これは機能しません。

提案がありますか?私は自分の道が非常に非効率的だと思っています。

+0

数十秒はうまくいかないように聞こえません。ただ我慢して!あなたは何百もありますか?整形されたデータ(JSON、CSV、YAMLなど)としてディレクトリ構造をダンプし、データレベルで比較するのはなぜですか? – tadman

答えて

2

ruby​​を忘れて、rsyncコマンドのマニュアルを読んでください。 dry-runまたはその他のオプションを組み合わせて使用​​すると、ファイルをコピーせずに両方のメインディレクトリを比較することができます。これは、この作業を行うために費やされる実行と時間の点ではるかに高速です。

+0

明確にするために、ディレクトリ構造がバックアップシステム上で未編成であるという問題があります。ファイルはメインサーバーと同じフォルダには格納されません。だから私はファイル名/サイズの基準をチェックし、ディレクトリを使用しないでください。 – Max

+0

いくつかのコードを貼り付けることができますか?実際に見たときにどのように改善できるかを簡単に伝えることができます。 –

0

Dir.globは、Arrayを返しますので、検索する各ファイルの完全なファイルリストをスキャンする必要があります。 100,000ファイルがある場合は、100,000^2の操作を実行することになります。一定の時間アクセスを持つSetを組み込み、作業負荷を100,000回に減らすことで、かなり高速化できます。あなたはこのような何かを試すことができます。

require 'set' 
files_to_search = Set.new(Dir.glob('/that/path/**/*')) 
files_to_search.include?('foo') 

Setがそうしない場合にも、メモリ、またはRubyは比較的すべてが速くないという事実のように、しかし、他の制約に実行している、そうかもしれませんトリック、あなたはシェルツールを使って何かを試したいかもしれません。 MichałMłoźniakのrsyncソリューションではこのトリックを行うかもしれません。あるいは、シェルコマンドを一緒にパッチを当てて、探している情報を得るためのほんの少しの方法が考えられます。例えば、diffをチェックしてみてください。恐らくfindとペアになっています。

関連する問題