1

約 30 個のランダムな名前の XML ファイルを含むディレクトリがあります。したがって、名前はその内容についての手がかりにはなりません。そして、定義済みのルールに従って、これらすべてのファイルを 1 つのファイルにマージする必要があります。残念ながら、単純なスタイルシートを使用するには複雑すぎます。
各ファイルは、そのルート内に最大 15 の異なる要素を持つことができます。そのため、それぞれ XDocument をパラメーターとして取り、XML 内の特定の要素を検索する 15 の異なるメソッドがあります。次に、そのデータを処理します。また、これらのメソッドを特定の順序で呼び出すため、すべてのデータが正しい順序で処理されることを保証できます。
ノードの例には、製品のリスト、特定の製品コードの価格のリスト、製品名の翻訳のリスト、国のリスト、特定の国での製品の割引のリストなどがあります。いいえ、これらも非常に単純な構造ではありません。

今、私は次のようなことをしています:

List<XmlFileData> files = ImportFolder.EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly).Select(f => new XDocument(f.FullName)).ToList();
files.ForEach(MyXml, FileInformation);
files.ForEach(MyXml, ParseComments);
files.ForEach(MyXml, ParsePrintOptions);
files.ForEach(MyXml, ParseTranslations);
files.ForEach(MyXml, ParseProducts);
// etc.
MyXml.Save(ExportFile.FullName);

メモリ内での読み取りを減らし、より高速な結果を生成する方法でこれを行うことができるかどうか疑問に思います。ただし、速度はメモリよりも重要です。したがって、このソリューションは機能します。より少ないメモリを使用するより高速なものが必要です。
助言がありますか?

4

2 に答える 2

0

ルールの複雑さと、さまざまなファイル間でのデータの相互依存性に応じて、おそらく各ファイルを並行して処理できます (または、少なくともファイルの特定のチャンク)。

読み取り中に XDocument が変更されていないことを考えると、データを並行して収集できる可能性が最も高く、速度が向上する可能性があります。

https://msdn.microsoft.com/en-us/library/dd460693%28v=vs.110%29.aspxを参照してください。

読み込んでいるデータを調べて、メモリ使用量を低く抑える (さらに速度を上げる) ために特別な方法で作業できるかどうかを調べる必要があります。

于 2015-04-28T16:23:13.387 に答える
0

1 つのアプローチはList<XElement>、異なるデータ型ごとに個別に作成することです。例えば:

List<XElement> Comments = new List<XElement>();
List<XElement> Options = new List<XElement>();
// etc.

次に、ドキュメントごとに、そのドキュメント内の要素を調べて、適切なリストに追加できます。または、擬似コードで:

for each document
    for each element in document
        add element to the appropriate list

これにより、すべてのドキュメントを同時にメモリにロードする必要がなくなります。さらに、各ドキュメントに対して 1 回だけパスを実行します。

すべての文書を読んだら、さまざまな要素を 1 つのMyXml文書に連結できます。あれは:

MyXml = create empty document
Add Comments list to MyXml
Add Options list to MyXml
// etc.

このアプローチのもう 1 つの利点は、データの総量がメモリに収まらない場合、それらの要素のリストがファイルになる可能性があることです。すべての Comment 要素を Comments ファイルに書き込み、Options を Options ファイルに書き込みます。すべての入力ドキュメントを読み取り、個々の要素をファイルに保存したら、各要素を読み取ることができます。ファイルを使用して、最終的な XML ドキュメントを作成します。

于 2015-04-28T18:42:56.887 に答える