vbN*_*bie 3 .net out-of-memory
我突然得到了在不同机器上运行的两个程序的内存异常错误,即使看起来有足够的内存,它仍然显示出来.我正在程序中创建多个线程,所以不确定这是否适合这个论坛,但它可能是与visual studio相关的东西,或者它肯定是内存问题.一个程序在我的桌面上使用visual studio 2008和2 gb ram运行.另一个使用visual basic 2008 express在运行4 GB RAM的Windows 2003服务器上运行.现在,模块将一个大的xml文件读入一个字符串,然后拆分并存储在一个字符串数组中.现在块的数量可以达到10000.现在我知道这很大,但我已经运行了一个多月了,从来没有遇到过这个问题.我注意到的另一个可能的相关问题是我的硬盘驱动器上的空间不足,但很快就通过清理解决了这个问题.哦,是的,我的机器的处理器是一个设置在2.13 GHZ的双核心.它是一个控制台程序,可以生成多个Web请求,但内存问题只出现在一个特定模块中,正如我上面所解释的那样.
Public Shared Function textLoad(ByVal _html As String) As Boolean
Try
//_html is the filestream that was read in
Dim defaultHeading = "xmlns:gnip=""http://www.gnip.com/schemas/2010"" xmlns=""http://www.w3.org/2005/Atom"""
Dim header_of_xml As String = "<?xml version=""1.0"" encoding=""utf-8""?>" & vbNewLine & "<entry " & defaultHeading & ">"
Dim footer_of_xml As String = "</entry>"
Dim entry As String = String.Empty
Dim xrs As XmlReaderSettings = New XmlReaderSettings()
Dim dupeArray As New ArrayList
Dim stringSplitter() As String = {"</entry>"}
//split the file content based on the closing entry tag
sampleResults = Nothing
sampleResults = _html.Split(stringSplitter, StringSplitOptions.RemoveEmptyEntries)
entryResults.Clear()
If getEntryId(sampleResults) Then
// the following loops seem clumsy but I wanted to dedupe the lists to //ensure that I am not adding duplicate entries and I do this by going to the getEntryID //method and extracting the ids and then comparing them below
For i As Integer = 0 To sampleResults.Count - 1
For j As Integer = 0 To idList.Count - 1
If sampleResults(i).Contains(idList.Item(j)) AndAlso Not dupeArray.Contains(idList.Item(j)) Then
dupeArray.Add(idList.Item(j))
entry = sampleResults(i)
Run Code Online (Sandbox Code Playgroud)
我确实看过taskmanager来识别这个程序使用的资源,这是正在发生的事情:
Parser.exe CPU = 34 MEM使用率= 349,500 K.
没有别的东西在运行
编辑_ -
找出问题的确切位置:
**sampleResults = _html.Split(stringSplitter, StringSplitOptions.RemoveEmptyEntries)**
Run Code Online (Sandbox Code Playgroud)
谁能注意到这个有什么问题?
Split方法为返回数组中的每个元素分配字符串对象的内存.如果你要遇到内存问题,它就会出现在那条线上.由于您在一个可能碎片堆上同时为可能10,000个大字符串分配内存,因此您可能无法找到足够的连续空间来分配下一个字符串(这会产生结果)并不奇怪在您遇到的例外中).你真的需要所有这些字符串吗?或者你可以做这样的循环:
如果您能以这种方式实施解决方案,那么您的问题应该会消失.
请注意,OOM 并不意味着物理 RAM 不足,而是意味着您无法将所需大小的新内存块放入地址空间。
造成这种情况的可能原因有很多
然后还有假的 OOM 异常。例如,GDI+ 会针对包括无效参数在内的多种问题返回内存不足错误。这些也会变成 OOM 异常。
| 归档时间: |
|
| 查看次数: |
37384 次 |
| 最近记录: |