2011-10-24 23 views
2

私はmp3ファイルを検索し、指定されたディレクトリにコピーするプログラムを書いています。ファイルを検索する最も効率的な方法

現在、私はディレクトリ内のすべてのmp3で満たされたリストを使用しています(これは、驚くことではありません。非常に長い時間です)。次に、taglib-sharpを使用してID3Tagsとアーティストとタイトルを比較します。一致する場合はファイルをコピーします。

これは私の最初のプログラムであり、私はプログラミングに非常に新しいので、これを行うにはより良い/より効率的な方法が必要であると思います。誰かが私が試すことができるものについての示唆を持っていますか?

編集:重要な詳細を追加するのを忘れた:検索を開始するたびに検索するディレクトリを指定できます(検索するディレクトリはプログラム自体で指定されます)。だから、データベースやそれに類するものにすべてのファイルを保存することは、本当にオプションではありません(効率的なたびにこれを行う方法がない限り)。私は基本的に、ファイルが毎回インデックスされるディレクトリ内のすべてのファイルを検索する最善の方法を探しています。 (これはおそらく良いアイデアではないと私は認識していますが、そうしたいと思います。これを行う本当の方法がない場合は、再考する必要がありますが、今のようにしたいと思います)

+0

最適化したいコードを表示します。そうでなければ、誰が何を最適化できるか分からない。 – Peter

+0

@peer:ディスクから読み込むときに行う最適化はあまりありません。あなたは何を思いついたのですか? – jgauffin

答えて

1

すべてのファイルをキャッシュするには、データベース(単純なバイナリのシリアライズされたファイルまたはRavenDbなどの組み込みデータベース)を使用します。代わりにそのキャッシュをクエリします。

データベース内の各フォルダの変更時刻も保存します。アプリケーションを起動するたびに、データベースの時刻とフォルダの時刻を比較します(変更されたフォルダを同期させます)。

それはあなたにはるかに優れたパフォーマンスを与えるはずです。スレッディングは本当にあなたのアプリケーションではなく時間がかかるディスクIOなので、フォルダの検索には役立ちません。

+0

私は自分の質問をするときに忠実な詳細を含めるのを忘れてしまった、元の質問を編集した。基本的には、検索が開始されるたびにすべてのファイルのインデックスを作成できます。そのため、データベースは実際にはオプションではありません(ファイルが毎回新しいものとして保存される場合でも効率的でない場合を除きます)。これについて前もって言及してくれないのは残念です。 – boert03

2

ほとんどの場合、作業中のハードウェアの結果であるIOというボトルネックがあります。ここで分母となるファイルをコピーすることになります(ファイルを見つけることを除いて、コピーと比較して矮小です)。

ありは、ファイル管理について移動する他の方法であり、それぞれは、たとえば、そのようなNTFS Change Journalsなど、さまざまな目的のためのより良いインターフェース、およびハンドリング低レベルの部門(推奨されません)を露出するが、これはC#で、あなたの最初のプログラムであれば多分あなたはp /ネイティブコールを呼び出すことに挑戦したくないかもしれません。

実際のプロセスの代わりに、ディスクアクセスを最小限に抑えるメカニズム、つまりすでに実行したことをやり直すことはしないでください。

+0

ディスクアクセスを最小限にすることは、すべてのファイルが格納されているリストを使用しようとしたときに気にしていたことです。この方法で、私はそれが満たされた後にリストを見ることができます。しかし、これは良いアイデアだとは思えません。なぜなら、何万ものエントリが入っているリストはかなり遅い/遅くなる可能性があるからです。 – boert03

関連する問題