2014-01-13 4 views
6

非常に大きなプロジェクト(+ 700MB)でC#で検索アルゴリズムを作成しようとしていますが、経験が不足しているため、終了する数時間前/エラーを見つける。誰かが私のためにそれをするよう求めているのではなく、私がアルゴリズムを指すように、私はそれを勉強し、学び、実装するかもしれません。C#の非常に大きなプロジェクトのテキストファイル検索アルゴリズムを探しています

プロジェクト:私は(ロード・ファイルのような)多くのキーと値を持つテキストファイルを持っているが、のはINIファイルを呼び出してみましょう。私はまた、多くのフォルダに多くのファイルを持つ巨大なプロジェクトを持っています。これらのINIキーのそれぞれに対して:

1)すべてのキーがロードされていることを確認するために、プロジェクト全体(INIファイルではない)を検索します。各値は、個別に、LoadIniValue()という名前の関数でロードされます。これらの関数のいずれかで値が呼び出されない場合は、最終的にINIファイルから値を削除する必要があります。

2)このLoadIniValue()関数には、値が格納され、パラメータとして渡されるコンテナもあります。このパラメータを新しい検索キーとして使用すると、プロジェクト内のどこのコンストラクタやデストラクタでも使用されますか?パラメータが使用されていない(評価されている、読み込まれている、など)場合は、最終的にINIファイルから削除する必要があります。

このプロジェクトの目的は、未使用のパラメータを持たないクリーンなINIファイルを作成することです。

私は本当にこれが有効な質問と考えられ、誰かがヒントを提供できることを願っています。

おかげさまで、このコミュニティに感謝しています。あなたたちは本当に素晴らしいです!

+1

私の代わりにデータベースを使用します。) –

+0

@TimSchmelterを:私は、ハッシュテーブルを考えますが、プロジェクトは常に変化しているので、それはありません多くの時間を必要とするでしょうか? – ElAlarconSoy

+0

もう少し説明できますか?私が正しく理解していれば(そして非常によくないかもしれませんが)、ここではプロジェクト内の各ファイルを開いて、.iniファイル内のキーが含まれているかどうかを確認します。次に、値が見つからないものは.iniファイルから削除する必要がありますか?あなたのプロジェクトは本質的にそれですか?また、検索しているファイルはどのように見えますか、開いているファイルはどれくらい大きくなっていますか?あなたは今、彼らの中でどのように検索しますか? –

答えて

3

インデックス作成エージェントが必要です。自分で最初から設計する必要はないと思う。 Luceneを使用してこれらのファイルのインデックスを作成し、そのAPIを使用して出力を取得します。

foreach (entry in INI) 
    foreach (file in ProjectFiles) 
     Search for entry 

が、これはあなたがINIファイル内のすべてのキーのすべてのファイルを検索しますケースであるべき:

+0

わからない使用されますC#プロジェクトを作成する必要があります私の仕事の結果は企業によって使用されるので、それを明確に見ていきます – ElAlarconSoy

0

はあなたの説明に続いて、あなたのコードは、この擬似コードのようなものを行います。ほとんどの場合、ファイルはあまり変更されておらず、値を検索している間はファイルがまったく変更されないことが予想されます。

あなたは、あなたのファイルを通じて一度だけ実行し、LoadIniValue()方法ですべて使用するキーのリストを構築することができます。次に、INIファイルのエントリが使用済みキーのリストにあるかどうかを確認できます。そうでない場合は削除することができます。これにより、ファイルを読み込む必要がなくなり、IOを少なくしてより速く実行する必要がなくなります。

0

これは2回のパスで行う必要があるようです。

最初のパスで、すべてのソースファイルを検索してLoadIniValue()への呼び出しを探します。使用されているキーの名前とコンテナも格納します。このパスの最後には、コードで使用されるkey, containerペアのリストがあります。

INIファイルのキーと照合してください。 INIに存在するが、key, containerのリストにないキーは使用されていません。一覧にあり、INIファイルにないキーは、おそらくエラーです。

は今、実際にコンストラクタとデストラクタの外で使用されているリスト内のコンテナのかを決定するために、ソースを介して第2のパスを行います。

これはかなり迅速に実行する必要があります。おそらく10分以内です。その700 MBにはいくつのファイルがあるのか​​は言わないが、かなりあると思われる。ファイルが小さい場合は、主なボトルネックがファイルを開いています。上記の方法では、各ファイルを2回だけ開く必要があります。あなたの質問を完全に理解していれば、現在の実装ではすべてのINIキーとすべてのコンテナ名のすべてのファイルが開かれています。

あなたの現在のコードが動作し、あなたはそれを少し高速化したい場合は、一度だけメモリにすべてのファイルをロードし、その後、メモリのあなたの検索のすべてを行うことができるかもしれません。これにより、すべてのファイルを複数回開いて読み込むオーバーヘッドがなくなります。私はそれがあなたに10倍のパフォーマンスの向上を与えるのを見て驚くことはありません。私が上で提案した2パスのソリューションほど高速ではありませんが、十分に良いかもしれません。

関連する問題