Linq to Xml API が大好きです。私が今まで使った中で最も簡単なもの。
XmlReader
また、非キャッシング リーダーであるtop が実装されていることも思い出しました。つまり、次のことを意味します。
var rdr = XmlReader.Create("path/to/huge_3Gb.xml");
...すぐに返されます(おそらく、せいぜいxmlヘッダーを読み取っただけです)。
のドキュメントにXDocument.Load()
は、実際に を使用していると記載されていXmlReader.Create()
ます。
すべてのLinqと同様に、Linq2Xml で遅延実行動作が得られることを期待していました。
しかし、ファイルに触れるものに対して通常行うように、これを試しました:
using(var xdoc = XDocument.Load("file")){ ... }
と驚き!XDocument が実装されていないため、コンパイルされませんIDisposable
。
うーん、それは独特です!の使用が終わったら、ファイル ハンドルを解放するにはどうすればよいXDocument
ですか?
そして、それは私に気づきました:XDocument.Load()
メモリ内のXml全体を一度に消費するかもしれません(そしてすぐにファイルハンドルを閉じます)?
だから私は試しました:
var xdoc = XDocument.Load("path/to/huge_3Gb.xml");
そして待って、待って、そしてプロセスは言った:
Unhandled Exception: OutOfMemoryException.
そのため、Linq to Xml はほぼ完璧 (素晴らしい API) ですが、葉巻はありません (大きな Xml で使用する場合)。
</rant>
私の質問は次のとおりです。
何か不足していますか?Linq to Xmlを遅延して使用する方法はありますか?
前の質問の答えが「いいえ」の場合:
Linq to Xml API が、たとえば Linq to Objects と同様の遅延動作を持つことができない客観的な理由はありますか? 少なくともいくつかの操作 (たとえば、 forward-only で可能なことXmlReader
) は遅延して実装できるように見えます。
...または、 Eric Lippertを引用して、このように実装されていません。
「誰もその機能を設計、指定、実装、テスト、文書化、出荷していないからです」?