2012-01-19 20 views
2

私は以下を実行しようとしています。ディレクトリの下にあるファイル名でデータベースを埋めました。このディレクトリは絶えず変化しています(ダウンロードされたファイルが追加および削除されています)。私のアプリケーションは、このディレクトリを初めてスキャンし、ファイルをデータベースに追加することになっています。 2回目のアプリケーションの実行時には、データベース内のファイル名がディレクトリ内でまだ使用可能かどうかを確認する必要があります。ファイルがゴミすぎずに存在するか確認してください。

私は以下の擬似コードを使用し、チェックするために:

get the filename from the database 
check if exists (file f = new File(filename)) 
       if (f.exists()){ 
        mark as existing; 
        } else { 
        mark is as deleted 
        } 

if it does, then mark it as existing, else mark it as removed (later will clean the database up) 

質問です:彼らは多くのゴミを発生させることなく存在しているかどうかはどのようにデータベース上のすべてのファイルを確認することができますか?ファイルは1000以上にすることができます。 "new File(...)"を1000回以上繰り返してループを実行すると、ゴミが多すぎます。

何か助けていただければ幸いです。

答えて

4

File()オブジェクトは本当に小さいです。 のパス文字列はで、FileSystemオブジェクトへの参照です。無駄な資源のように見えますが、そうではありません。

オブジェクトをパスとして考えると、ファイルパスを扱うヘルパーメソッドはほとんどありません。 ファイル記述子やその他の重いリソースとは関係ありません。

プロファイリング前に最適化を行わないでください。あなたはコードを維持するのが最適ではないことになります。

+0

それは正しいです - ファイルは実際にファイルを開くことはありませんが、問題について行くのは間違った方法です。 –

+0

@MichałŠrajer。答えをありがとう。私は単純なアプリケーションを作って、ファイルオブジェクトが通常のファイル名の約100バイトのように見えました。それは私のアプリケーションのボトルネックではないかもしれません。さらにプロファイルされます。 +1 – Ermir

4

ファイルは 1000倍以上があまりにも多くのゴミが発生します「新しいファイル(...)」でループを実行している以上の1000ことができます。

本当に?あなたはこれをテストしましたか?現代のシステムでは、これが重大な懸念事項であるとは思えません。 (あなたはどうですか?JVMのガベージコレクション最も心配して何ですか?)

そうでない場合は、カレントディレクトリを取得し、その後、(HashSetはおそらくうまくやるだろう)パフォーマンスのためSet.list()または.listFiles()、負荷を呼び出し、そしてちょうどに対してクエリセット。 (同様のGCの懸案事項であるかもしれないセット内の文字列とエントリを作成しています。)潜在的な問題は、JVM内のメモリに潜在的に「大量の」要素をロードすることです。オンデマンドでデータベースから各行を読み取ることができます。

私はあなたが概説したコードに固執します。 +1はMichalの答えです。なぜこのことを心配するべきではないかという追加の詳細を見直してください。

+0

私はアプリケーションをプロファイリングし、スキャン中にメモリが高くなっています。それで、私はファイルの作成がこの問題を引き起こすと思ったのです。今や、それは単なる刻みであり、ファイル自体には何もしません。答えをありがとう。 +1 :) – Ermir

0

他の方法 - データベーステーブルに行セットを追加します。次に、ファイルが存在するディレクトリをスキャンし、ファイル名のリストを取得し、そのリストを 'ファイル名からファイル名を選択する'タイプのクエリと比較します。

+0

これも可能ですが、パフォーマンスにどのような影響があるかわかりません。とにかくコメントしてくれてありがとう。 – Ermir

関連する問題