【问题标题】:VB.Net XMLdocument memory managementVB.Net XML文档内存管理
【发布时间】:2014-03-21 21:44:27
【问题描述】:
Dim docu As New XmlDocument()
docu.load("C:\bigfile.xml")

Dim tempNode As XmlNode
tempNode = docu.SelectSingleNode("/header/type")

someArray(someIndex) = tempNode.innerText

...do something more...

我正在使用XmlDocument() 加载一个巨大的XML 文档(100~300MB)

当我打开文档并以string 阅读时,我的应用程序使用了大约 900MB 的 RAM。 我想知道为什么会发生这种情况,我该如何预防?

注意:即使XmlDocument 没有Dispose() 来删除分配的东西。 虽然我在应用程序的后面部分需要巨大 XML 文件的整个字符串,但 /header/type.innerText 只是一个单词


更多来源:

Private Sub setInfo(ByVal notePath As String)

        Dim _NOTE As XDocument

        _NOTE = XDocument.Load(notePath)

        If (From node In _NOTE...<title> Select node).Value = "" Then
            lvlist.Items.Add("No Title")
        Else
            lvlist.Items.Add((From node In _NOTE...<title> Select node).Value)
        End If

        lvlist.Items(lvlist.Items.Count - 1).SubItems.Add((From node In _NOTE...<group> Select node).Count)


End Sub

它读取 XML 文档,计算标签并检索字符串值。就这样。 有了这些值之后,_NOTE (XDocument) 在那个时候就没用了。

【问题讨论】:

  • 你试过用 XDocument 代替吗?
  • @Neolisk XDocument 可以在工作完成后释放内存吗?
  • 任何 .NET 对象都应该默认执行此操作,只需确保您控制变量范围 - 它直接影响对象的生命周期,从而影响您的内存消耗。我希望 XDocument 消耗的内存可能比 XmlDocument 少,因为 XDocument 对于 .NET 来说相对较新(希望在这种情况下更新更好)。
  • 是的,它们都将整个内容加载到内存中。你能展示更多你的代码吗?因此,我们可以获取您的 document 变量的范围(无论是 XmlDocument 还是 XDocument),以估计其生命周期。
  • @Neolisk 是的,即使 _NOTE 仅在 Sub 中使用,也没有进行明显的清理。我的电脑有 8GB 的​​ RAM 内存,这可能是原因,但我必须管理内存问题,因为加载 300MB XML 需要大约 2~4 倍的内存。

标签: vb.net memory-leaks linq-to-xml xmldocument xmlreader


【解决方案1】:

对,XmlDocument 没有Dispose 方法。它被放入内存。它确实遵循对象生命周期。因此,如果您在Function 中创建对象并返回您想要的字符串,那么它将释放自己,因为它会从Function 中丢失范围。

【讨论】:

    【解决方案2】:

    XmlReader 可能会解决您的需求。来自 MSDN:

    表示提供对 XML 数据的快速、非缓存、只进的访问的阅读器。

    【讨论】:

    • 很好的答案,然而,值得一提的是,虽然效率要低得多,但如果你真的想使用 XmlDocument,你可以将你的 XmlDocument 变量设置为 Nothing完成读取所需的元素值,然后您可以通过调用 GC.Collect 来强制进行垃圾回收。这将导致它立即释放被XmlDocument 对象使用的内存。不过,如果文件真的那么大并且您真的只需要一个元素值,则最好使用XmlReader
    • @StevenDoggart:谢谢你,史蒂文。您的评论值得提升为答案。 :)
    • @StevenDoggart 实际上,我已经尝试过了。我通过设置 docu=Nothing 和 GC.collect() 结束了代码。但是,它并没有释放内存...... XMLReader 与 XMLDocument 有很大不同吗?我的意思是,XMLReader 可以检索节点并选择单个节点等等吗?谢谢!
    • @klados:见How to: Parse XML with XmlReader。简短的回答 - 没有一对一的转换方法。好处 - 您可以使用 XmlReader 更好地控制,从而避免不必要的读取或内存消耗。便利通常是控制的反面。选择一个。
    • 我正在将 XMLDocument 转换为 XMLReader。虽然对内存管理显然有效,但它非常麻烦且没有指令性。
    猜你喜欢
    • 2010-11-27
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2016-07-24
    • 1970-01-01
    相关资源
    最近更新 更多