【发布时间】: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