如何/我可以使用linq到xml查询具有合理内存消耗的巨大xml文件?

时间:2011-04-30 00:35:17

标签: c# xml linq

我没有对linq to xml做过多少工作,但我见过的所有例子都将整个XML文档加载到内存中。

如果XML文件是8GB,你真的没有选项怎么办?

我的第一个想法是将XElement.Load Method (TextReader)FileStream Class的实例结合使用。

问题:这是否有效,这是解决搜索非常大的XML文件问题的正确方法吗?

注意:不需要高性能..我正在尝试获取linq到xml基本上完成程序的工作我可以编写循环遍历我的大文件的每一行并收集,但因为linq是“循环中心”我希望这是可能的......

3 个答案:

答案 0 :(得分:14)

使用XElement.Load会将整个文件加载到内存中。相反,请将XmlReaderXNode.ReadFrom函数一起使用,如果需要,您可以选择性地加载XmlReaderXElement找到的注释进行进一步处理。 MSDN就是这样做的一个很好的例子:http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.readfrom.aspx

如果您只需要搜索xml文档,仅XmlReader就足够了,并且不会将整个文档加载到内存中。

答案 1 :(得分:8)

加布里埃尔,

老兄,这并不是完全回答你的实际问题(如何阅读大型xml文档使用linq ),但你可能想要查看我的旧问题What's the best way to parse big XML documents in C-Sharp。最后一个“答案”(时间)是关于实际工作的“自我说明”。事实证明,混合文档-XmlReader& doclet-XmlSerializer快速(足够)且灵活。

但请注意,我处理的文档最多只有150MB。如果你真的需要处理大到8GB的文档?然后我想你可能会遇到各种各样的问题;包括O / S的LARGE_FILE(> 2GB)处理的问题......在这种情况下,我强烈建议你保持尽可能原始的...并且XmlReader尽可能原始(并且根据我的最快)测试)Microsoft命名空间中提供的XML解析器。

另外:我刚刚注意到我的旧帖中有一条迟来的评论,建议我查看VTD-XML ...我刚刚看了一眼......它“看起来很有希望”,即使作者似乎已经签约了FIGJAM的终端案例。他声称它将处理高达256GB的文档;我回答“是的,你有没有测试过?在什么环境下?”这听起来应该可以工作......我已经使用相同的技术在文本帮助系统中实现“超链接”;回到HTML之前。

无论如何,祝你好运,以及你的整体项目。干杯。基思。

答案 2 :(得分:1)

我意识到这个答案可能被认为是无响应的并且可能很烦人,但我会说如果你有一个8GB的XML文件,那么至少你在XML中尝试做的一些事情应该由文件系统或数据库。

如果该文件中有大量文本,则可以将它们存储为单个文件,并分别存储元数据和文件名。如果不这样做,则必须具有多级结构化数据,可能需要对结构进行大量重复。如果您可以决定什么是可以存储为较小的XML文件或数据库列中的单个“记录”,那么您可以根据上面的嵌套级别来构建数据库。 XML非常适合小而脏,它对于非结构化数据也很有用,因为它是自构造的。但是如果你有8GB的数据,你将要做一些有意义的事情,你必须(通常)能够依靠其中某个可预测的结构。

将XML(或JSON)存储在数据库中,并查询和搜索XML记录以及XML内部现在都得到了很好的支持,无论是SQL内容还是NoSQL范例。

当然,你可能没有选择不使用这么大的XML文件,或者可能有某种情况它们确实是最好的解决方案。但对于一些阅读此内容的人来说,看看这个替代方案可能会有所帮助。