如何/我可以使用linq to xml查询具有合理内存消耗的巨大xml文件?
我没有对linq to xml做过多少工作,但我见过的所有例子都将整个XML文档加载到内存中。
如果XML文件是8GB,你真的没有选择怎么办?
我的第一个想法是将XElement.Load方法(TextReader)与FileStream类的实例结合使用。
问题:这是否有效,这是解决搜索非常大的XML文件问题的正确方法吗?
注意:不需要高性能..我正在尝试获取linq到xml基本上完成程序的工作我可以编写循环遍历我的大文件的每一行并收集,但因为linq是“循环中心” “我希望这是可能的……
使用XElement.Load
会将整个文件加载到内存中。 相反,将XmlReader
与XNode.ReadFrom
函数一起使用,如果需要,可以选择性地加载XmlReader
与XElement
找到的注释以进行进一步处理。 MSDN就是这样做的一个非常好的例子: http : //msdn.microsoft.com/en-us/library/system.xml.linq.xnode.readfrom.aspx
如果您只需要搜索xml文档,单独使用XmlReader
就足够了,并且不会将整个文档加载到内存中。
加布里埃尔,
老兄,这并不是完全回答你的实际问题(如何使用linq阅读大型xml文档)但你可能想要查看我的旧问题什么是在C-Sharp中解析大型XML文档的最佳方法 。 最后一个“答案”(按时间)是一个“自我记录”实际工作的内容。 事实certificate,混合文档-XmlReader和doclet-XmlSerializer快速(足够)且灵活。
但请注意,我处理的文档最多只有150MB。 如果你真的必须处理大到8GB的文件? 那么我想你可能会遇到各种各样的问题; 包括O / S的LARGE_FILE(> 2GB)处理的问题……在这种情况下,我强烈建议你尽可能保持原始…并且XmlReader尽可能原始(根据我的测试最快) )Microsoft命名空间中可用的XML解析器。
另外:我刚刚注意到我的旧帖中有一条迟来的评论,建议我查看VTD-XML …我刚刚看了一眼……它“看起来很有前途”,即使作者似乎有签约了FIGJAM的终端案例。 他声称它将处理高达256GB的文件; 我回答“是的,你有没有测试过?在什么环境下?” 这听起来应该可以工作……我已经使用同样的技术在文本帮助系统中实现“超链接”; 回到HTML之前。
无论如何,祝你好运,以及你的整体项目。 干杯。 基思。
我意识到这个答案可能被认为是无响应的并且可能很烦人,但我会说如果你有一个8GB的XML文件,那么你在XML中尝试做的至少一些应该由文件系统来完成或数据库。
如果该文件中有大量文本,则可以将它们存储为单个文件,并分别存储元数据和文件名。 如果不这样做,则必须具有多级结构化数据,可能需要对结构进行大量重复。 如果您可以决定什么是可以存储为较小的XML文件或数据库列中的单个“记录”,那么您可以根据上面的嵌套级别来构建数据库。 XML非常适合小而脏,它对于非结构化数据也很有用,因为它是自构造的。 但是如果你有8GB的数据,你将要做一些有意义的事情,你必须(通常)能够依靠其中某个可预测的结构。
在XML数据库中存储XML(或JSON),以及查询和搜索XML记录以及XML内部都得到了很好的支持,无论是SQL内容还是NoSQL范例。
当然,您可能没有选择不使用这么大的XML文件,或者您可能遇到一些他们真正是最佳解决方案的情况。 但对于一些阅读此内容的人来说,看看这个替代方案可能会有所帮助。