我对linq to xml做得不多,但我看到的所有示例都将整个xml文档加载到内存中。
如果XML文件是8GB,而您确实没有这个选项,该怎么办?
我的第一个想法是使用XElement。加载方法(TextReader)和一个FileStream类的实例。
问题:这能工作吗?这是解决搜索一个非常大的XML文件问题的正确方法吗?
注意:高性能不是必需的。我试图让linq到xml基本上做程序的工作,我可以写循环通过每一行我的大文件和收集,但由于linq是"循环为中心",我希望这是可能的....
使用XElement.Load
将把整个文件加载到内存中。相反,使用XmlReader
和XNode.ReadFrom
函数,如果需要的话,可以有选择地用XElement
加载XmlReader
找到的注释以进行进一步处理。MSDN有一个很好的例子:http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.readfrom.aspx
如果您只需要搜索xml文档,单独XmlReader
就足够了,它不会将整个文档加载到内存中。
Gabriel,
老兄,这并没有完全回答你的实际问题(如何使用linq阅读大xml文档),但你可能想要检查我的老问题,用C-Sharp解析大xml文档的最佳方法是什么。最后一个"答案"(时间上的)是"给自己的笔记",告诉自己什么才是真正有效的。事实证明,混合文档- xmlreader &doclet-XmlSerializer快速(足够)且灵活。
但是请注意,我处理的文档只有150MB。如果你真的需要处理8GB的文档?那么我猜你可能会遇到各种各样的问题;包括O/S的LARGE_FILE (>2GB)处理问题…在这种情况下,我强烈建议您尽可能保持原始……而XmlReader是Microsoft名称空间中可用的最基本的xml解析器(根据我的测试,它是最快的)。
还有:我刚刚注意到一个迟来的评论在我的旧线程建议我检查VTD-XML…我刚才匆匆看了一眼。它"看起来很有希望",即使作者似乎已经感染了FIGJAM的晚期病例。他声称它可以处理高达256GB的文档;我回答说:"是的,你测试过吗?"在什么环境下?"听起来应该行得通……我曾使用同样的技术在文本帮助系统中实现"超链接";
无论如何,祝你好运,以及你的整个项目。欢呼。基斯。
我知道这个答案可能被认为是无响应的,而且可能令人讨厌,但我想说的是,如果您有一个8GB的XML文件,那么至少您尝试在XML中做的一些事情应该由文件系统或数据库完成。
如果文件中有大量文本,可以将它们存储为单独的文件,并分别存储元数据和文件名。如果你不这样做,你必须有很多层次的结构化数据,可能有很多重复的结构。如果您可以决定将什么视为单独的"记录",可以将其存储为较小的XML文件或存储在数据库的列中,那么您可以根据其之上的嵌套级别构建数据库。XML非常适合小而脏的数据,也适合非结构化的数据,因为它是自结构化的。但如果你有8GB的数据,你要做一些有意义的事情,你必须(通常)能够指望一些可预测的结构在它的某个地方。
在数据库中存储XML(或JSON),查询和搜索XML记录,以及在XML中查询和搜索,现在SQL和NoSQL范例都很好地支持。
当然,您可能无法选择不使用这么大的XML文件,或者您可能在某些情况下它们确实是最好的解决方案。但是对于一些读到这篇文章的人来说,看看这个替代方案可能会有所帮助。