5

最初の XmlDocuments をメモリに保持せずに 2 つの XmlDocuments を組み合わせる方法はありますか?

最大 100 個の大きな (~300MB) XML ファイルのリストを循環し、それぞれに最大 1000 個のノードを追加し、プロセス全体を数回繰り返す必要があります (メモリを節約するために新しいノード リストがクリアされるため)。XmlDocument現在、新しいノードを追加する前に全体をメモリにロードしますが、これは現在維持できません。

これについてどうするのが最善の方法だと思いますか? いくつかのアイデアがありますが、どれが最適かわかりません。

  1. 全体XMLDocumentをロードするのではなく、XmlReaderと をXmlWriter同時に使用して一時ファイルに書き込みます。一時ファイルはその後名前が変更されます。
  2. 新しいXmlDocumentノードのみを作成し、既存のファイルに手動で書き込みます (つまり、file.WriteLine( "<node>\n" )
  3. 他の何か?

どんな助けでも大歓迎です。

コメントのいくつかに答えて、いくつかの詳細を編集します。

このプログラムは、いくつかの大きなログを XML に解析し、ソースごとに異なるファイルにグループ化します。1 日に 1 回実行するだけで済み、XML が書き込まれると、データに関するレポートを提供する軽量の独自のリーダー プログラムが作成されます。プログラムは 1 日に 1 回しか実行する必要がないため、遅くなる可能性がありますが、サーバー上で実行され、主にファイルの圧縮と転送などの他のアクションを実行します。

データベースの方が簡単かもしれませんが、会社はすぐにこれを行うつもりはありません!

そのままでは、プログラムは開発マシン上で最大数 GB のメモリを使用して実行されますが、サーバー上で実行するとメモリ不足の例外がスローされます。

最終編集 このタスクは非常に優先度が低いため、データベースを取得するのに余分な費用がかかるだけです (ただし、mongo について調べます)。

ファイルは追加されるだけで、無期限に大きくなることはありません。最終的な各ファイルは 1 日分のログのみであり、新しいファイルは翌日に生成されます。

XML の有効性を確認するのが最も簡単なので、おそらく XmlReader/Writer メソッドを使用しますが、すべてのコメント/回答を考慮しました。XML ファイルをこのように大きくすることは特に良い解決策ではないことはわかっていますが、それは私が制限していることなので、与えられたすべての助けに感謝します。

4

1 に答える 1

2

XML 構造を完全に把握したい場合は、XMLWriter と XMLReader を使用するのが最善の方法です。

ただし、可能な限り最高のパフォーマンスを得るには、直接文字列関数を使用してこのコードをすばやく再作成できる場合があります。これを行うことはできますが、XML 構造を検証する機能は失われます。1 つのファイルにエラーがあった場合、それを修正することはできません。

using (StreamWriter sw = new StreamWriter("out.xml")) {
    foreach (string filename in files) {
        sw.Write(String.Format(@"<inputfile name=""{0}"">", filename));
        using (StreamReader sr = new StreamReader(filename)) {
            // Using .NET 4's CopyTo(); alternatively try http://bit.ly/RiovFX
            if (max_performance) {
                sr.CopyTo(sw);
            } else {
                string line = sr.ReadLine();
                // parse the line and make any modifications you want
                sw.Write(line);
                sw.Write("\n");
            }
        }
        sw.Write("</inputfile>");
    }
}

入力 XML ファイルの構造によっては、XML ヘッダー、おそらくドキュメント要素、または他のいくつかの不要な構造を削除することを選択できます。ファイルを1行ずつ解析することでそれを行うことができます

于 2012-08-03T18:23:46.117 に答える