0

ドキュメント情報とファイルシステム上のファイルを指すファイルパスを含むかなり大きなテーブルが1つあります。数年後、DBテーブルで参照されていないファイルがディスク上にあることに気付きました。その逆も同様です。

現在Clojureを学んでいるので、dbとファイルシステムの違いを見つけることができる小さなユーティリティを作成するといいと思いました。当然のことながら、私は初心者なので、600 000を超えるドキュメントがあり、明らかにパフォーマンスが高く、メモリ消費の少ないソリューションが必要なため、行き詰まりました:)

私の最初のアイデアは、すべてのファイルでフラット化されたファイルシステムツリーリストを生成し、それをdbのリストと比較することでした。ファイルが存在しない場合は、別のリスト「存在しない」に入れ、ファイルがHDDに存在し、DBに存在しない場合は、移動します。いくつかのダンプディレクトリにそれを。

何か案は?

4

2 に答える 2

1

スケッチとして、満足のいくサイズのチャンクで、データベースに対してファイルシステムをチェックする方法を次に示します。

(->> (file-seq (java.io.File. "/"))
     (remove (memfn isDirectory))
     (partition 20)
     (map (fn [files] (printf "Checking %d files against db...\n" (count files))))
     (take 2))

(Checking 20 files against db...
Checking 20 files against db...
nil nil)

を使用する代わりにprintf、ファイルのリストに対してある種のデータベースチェックを実行します。

于 2011-09-20T21:04:53.150 に答える
0

パフォーマンスとメモリの好みに応じて、次の3つのオプションのいずれかをお勧めします。

  1. メモリを大量に消費する:File.listFilesを呼び出す再帰メソッドを使用して、すべてのファイルをリストに入れます。次に、リストをDBと比較します。

  2. IOを多用するソリューション:DBに対して一度に1つずつ再帰的に各ファイルをチェックします。

  3. 中間ソリューション:1つのディレクトリ内のすべてのファイルを読み取り、それらをDBと比較します。任意のサブディレクトリで繰り返し、繰り返します。オプション1と同じ数のIO呼び出しがありますが、一度に1つのブランチ+1ディレクトリに相当するファイルパスのみがメモリに保持されます。

于 2011-09-20T10:55:42.797 に答える