3

400k以上のXMLドキュメントを含むフォルダーがあり、今後さらに多くのファイルがあります。各ファイルには「ID」.xmlという名前が付けられ、それぞれが特定のユーザーに属しています。SQLサーバーデータベースでは、XMLドキュメントをユーザーと相互接続する場所であるuserIDと一致するXMLファイルの「ID」があります。ユーザーは、無限の数のXMLドキュメントを添付できます(ただし、最大で10,000を超えるドキュメントとしましょう)。

すべてのXMLドキュメントにはいくつかの共通要素がありますが、構造は少し異なる場合があります。

これで、各ユーザーは自分に属するXMLドキュメントを検索する必要があります。これまでに試したこと(各ファイルをループしてストリームリーダーで読み取る)は遅すぎます。ファイル全体を読み取って属性などと照合するのか、各要素のテキストだけを照合するのかは関係ありません。最初に返されるのは、ファイル名のIDを含むリストです。

もしあれば、ここで最も速くて賢い方法は何ですか?

4

7 に答える 7

2

LINQ-to-XMLはおそらくあなたが行きたい方向だと思います。

必要なタグの名前がわかっていると仮定すると、それらの特定の要素を検索して値を返すことができます。

var xDoc = XDocument.Load("yourFile.xml");

var result = from dec in xDoc.Descendants()
             where dec.Name == "tagName"
             select dec.Value;

resultsIEnumerable次に、 「tagName」と一致する名前を持つXMLタグの値が含まれます。

クエリは次のように書くこともできます:

var result = from dec in xDoc.Decendants("tagName")
             select dec.Value;

またはこれ:

var result = xDoc.Descendants("tagName").Select(tag => tag.Value);

出力は同じになります。要素名に基づいてフィルタリングする方法が異なります。

于 2012-05-09T12:17:43.013 に答える
2

関連するデータを含む各ファイルを開く必要があります。どのファイルにデータが含まれているかわからない場合は、一致する可能性のあるすべてのファイルを開く必要があります。したがって、パフォーマンスの向上は解析ルーチンのみになります。

Xmlを解析するときに、速度が必要XmlReaderな場合は、他のパーサーよりもパフォーマンスが優れているため、を使用できます(ほとんどの場合、クエリを実行する前にXmlファイル全体を読み取ります)。フォワードのみであるという事実は、この場合の制限ではありません。

解析にディスクI/Oと同じくらいの時間がかかる場合は、ファイルの解析を並行して試すことができるため、一方のスレッドがファイルの読み取りを待機し、もう一方のスレッドがロードされたデータを解析します。しかし、そこではそれほど大きな勝利を収めることはできないと思います。

また、「遅すぎる」とは何で、何が許容できるのでしょうか。多くのファイルのこのソリューションは、時間の経過とともに遅くなりますか?

于 2012-05-09T12:18:10.050 に答える
1

LINQtoXMLを使用します。

この記事をチェックしてください。msdnで終了します。

XDocument doc = XDocument.Load("C:\file.xml");

また、非常に多くのファイルの読み取りが常に遅くなることを忘れないでください。マルチスレッドプログラムを作成してみてください...

于 2012-05-09T12:10:51.497 に答える
1

私が正しく理解していれば、linq to xmlを使用しているのか、他の方法を使用しているのかが遅すぎるため、特定のユーザーの各xmlファイルを開きたくないでしょう。いくつかの値をxmlファイルとリレーショナルデータベース(タグ)の両方に(xml IDと一緒に)保存することを検討しましたか?その場合、最初にDBでいくつかの値を検索し、検索された値を含むxmlファイルのみを選択できますか?

例:ID、tagName1、tagName2 xmlDocID、value1、value2

私の他の質問は、なぜxmlドキュメントをファイルシステムに保存することを選択したのかということです。SQL Server 2005/2008を使用している場合は、xml列の格納、検索(xml内の一部の値のインデックス作成も含む)を非常に適切にサポートしています。

于 2012-05-09T12:31:08.500 に答える
0

コンテンツのどこかに特定の文字列が含まれているファイルを探していますか?

警告-純粋な.NETソリューションではありません。これがあなたを怖がらせるなら、他の答えに固執してください。:)

それがあなたがしていることであるならば、もう一つの選択肢はあなたのために重労働をするためにgrepのようなものを手に入れることです。「-l」引数を使用して、ファイル名のみに関心があり、勝者になることを指定します。(その他の使用例については、このリンクを参照してください)

于 2012-05-09T12:26:34.867 に答える
0

LBすでに有効なポイントを作成しています。これは、Lucene.Net(または任意のインデクサー)が必須である場合です。これにより、すべての検索で安定した(非常に高速な)パフォーマンスが得られます。また、非常に大量の任意のデータを処理できることは、インデクサーの主な利点の1つです。

それとも、Luceneを使用しない理由はありますか?

于 2012-05-09T12:47:28.993 に答える
0

Lucene.NET(およびLucene)は、インクリメンタルインデックスをサポートします。頻繁に読むためにインデックスを再度開くことができる場合は、一日中インデックスにドキュメントを追加し続けることができます。検索は、最後に検索のためにインデックスを再度開いたときと最新になります。

于 2012-05-11T12:20:16.190 に答える