3

現在、 XmlTextWriter クラスを使用して膨大なデータ(100000 件以上のレコード)を含むデータベース テーブルを xml ファイルにエクスポートしており、物理ドライブ上のファイルに直接書き込んでいます。

_XmlTextWriterObject = new XmlTextWriter(_xmlFilePath, null);

私のコードは正常に実行されますが、私の質問はそれが最善のアプローチですか? 代わりに、最初に xml 全体をメモリ ストリームに書き込んでから、xml ドキュメントをメモリ ストリームから物理ファイルに書き込む必要がありますか? どちらの場合も、メモリ/パフォーマンスにどのような影響がありますか?

編集

言いたいことが伝わらなくてすみません。指摘してくれたAshに感謝します。私は実際に XmlTextWriter を使用しますが、物理ファイル パス文字列を XmlTextWriter コンストラクター (または、ジョンが提案したようにXmlTextWriter.Create()メソッド) に渡すか、ストリーム ベースの API を使用するかを言うつもりでした。私の現在のコードは次のようになります。

XmlWriter objXmlWriter = XmlTextWriter.Create(new BufferedStream(new FileStream(@"C:\test.xml", FileMode.Create, System.Security.AccessControl.FileSystemRights.Write, FileShare.None, 1024, FileOptions.SequentialScan)), new XmlWriterSettings { Encoding = Encoding.Unicode, Indent = true, CloseOutput = true });
using (objXmlWriter)
{
   //writing xml contents here
}
4

3 に答える 3

9

経験則としてXmlWriter、ドキュメントを作成するだけでメモリ内で作業する必要がない場合に使用XmlDocumentし、メモリ内で作業する必要がある場合は (または DOM) を使用します。

XmlWriterただし、実装することを忘れないでくださいIDisposable。次のようにします。

using (XmlWriter _XmlTextWriterObject = XmlWriter.Create(_xmlFilePath))
{
   // Code to do the write here
}
于 2010-04-20T06:47:30.533 に答える
4

私のコードは問題なく実行されますが、私の質問はそれが最善のアプローチですか?

前述のように、あなたのアップデートXmlWriter.Createは大丈夫です。

または、最初にxml全体をメモリストリームに書き込み、次にxmlドキュメントをメモリストリームから物理ファイルに書き込む必要がありますか?

ファイル全体をメモリに書き込むためのメモリはありますか?そうすれば、そのアプローチはより速くなります。そうでなければFileStream、あなたのためにそれを処理するを使用してそれをストリーミングします。

そして、どちらの場合もメモリ/パフォーマンスにどのような影響がありますか?

XMLファイル全体を読み込むと、より多くのメモリが使用され、最初にプロセッサが急上昇します。ディスクへのストリーミングは、より多くのプロセッサを使用します。ただし、現在デスクトップハードウェアであっても、これを目立たせるには、巨大なファイルを使用する必要があります。今後さらにサイズが大きくなることが心配な場合は、このFileStream手法を使用して将来を保証します。

于 2010-04-20T08:11:27.440 に答える
2

John Saunders が述べたように、XmlWriter.Create() を使用することをお勧めします。これは MSDN からの推奨事項です。XmlWriter.Create() メソッドは、XmlWriterSettings オブジェクトも受け取ることができます。そこで、動作をかなりカスタマイズできます。検証と文字チェックが必要ない場合は、それをオフにして、もう少し速度を上げることができます。例えば

XmlWriterSettings settings = new XmlWriterSettings();
settings.CheckCharacters = false;
using (XmlWriter writer = XmlWriter.Create("path", settings))
{
    //writing code
    writer.Flush();
}

そうでなければ、私はすべてが大丈夫だと思います。

于 2010-04-20T08:01:07.700 に答える