次のような TXMLDocument を使用して XML を生成するコードがたくさんあります。
function Obj.SaveToXmlNode(XmlNode: IXmlNode; SubnodeName: string): IXmlNode;
begin
Result := XmlNode.AddChild(SubnodeName);
SaveFieldToXmlNode(Result, 'FIELD1', 'Value1', 'PrevValue1');
SaveFieldToXmlNode(Result, 'FIELD2', 'Value2', 'PrevValue2');
//...
end;
と
function SaveFieldToXmlNode(XmlNode: IXmlNode; FieldName: string; NewVal: Variant;
OldVal: Variant): IXmlNode;
var
FieldNode: IXMLNode;
begin
FieldNode := XmlNode.AddChild(FieldName);
FieldNode.NodeValue := NewVal;
if not VarIsEmpty(OldVal) then
FieldNode.Attributes[XML_OLDVALUE] := OldVal;
end;
大きな XML ファイルを生成するためにこの実装を使用すると、深刻な問題が発生しました。
- メモリ使用量: 大きなファイルの場合、このケースと同様に 1 GB を超えるメモリを使用することになりました。
- XML ファイルの生成はそれほど高速ではありません。
- 私の主な問題: XML は、http 要求への応答として Web サーバー内で生成されます。問題を回避するには、生成中に XML をストリームに書き込む必要があります。
私はこの問題を DOM ベースの XML ライターの使用に起因すると考えましたが、おそらく DOM ベースのライターでも、生成されたコンテンツを部分的にストリームに書き込み (およびロック) することで、この状況を処理できます。
既存のコードにあまり手を加えずに、この状況を解決するにはどうすればよいですか?
編集:この質問はクローズされましたが、関連するがより一般的な別の質問を投稿しました。これは、Delphi が XML を直接書き込む一般的な機能を対象としています。