gpt4 book ai didi

.net - 抛出了 'System.OutOfMemoryException' 类型的异常

转载 作者:行者123 更新时间:2023-12-02 04:16:48 29 4
gpt4 key购买 nike

我突然收到在不同机器上运行的两个程序的内存异常错误,即使看起来有足够的内存,它仍然显示。我正在程序中创建多个线程,因此不确定这是否适合此论坛,但它可能是与 Visual Studio 相关的其他内容,或者肯定是内存问题。该程序在我的桌面上运行,使用 Visual Studio 2008 和 2 GB RAM。另一个是使用 Visual Basic 2008 Express 在具有 4 GB RAM 的 Windows 2003 服务器上运行。现在,该模块采用一个大型 xml 文件,将其读入字符串,然后拆分并存储在字符串数组中。现在 block 的数量可以达到 10000。现在我知道这很大,但我已经运行了一个多月了,从来没有遇到过这个问题。我注意到的唯一可能的相关问题是我的硬盘空间不足,但通过清理很快就解决了。哦,是的,我的机器的处理器是双核,频率为 2.13 GHZ。它是一个控制台程序,可以发出多个网络请求,但正如我上面所解释的,内存问题仅出现在一个特定模块中。

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)

我确实查看了任务管理器来识别该程序使用的资源,这就是正在发生的事情:

Parser.exe CPU = 34 MEM 使用量 = 349,500 K

没有其他密集型正在运行

编辑_-

准确找出问题的根源:

**sampleResults = _html.Split(stringSplitter, StringSplitOptions.RemoveEmptyEntries)**

有人能注意到这有什么问题吗?

最佳答案

Split 方法为返回数组中的每个元素的字符串对象分配内存。如果您遇到内存问题,那么问题就出在这条线上。由于您一次在可能存在碎片的堆上为可能 10,000 个大字符串分配内存,因此您可能会遇到无法找到足够的连续空间来为下一个字符串分配的情况(这将导致在你得到的异常(exception)情况中)。您真的需要同时使用所有这些字符串吗?或者你可以做这样的循环:

  1. 一次读取一行(或读取到缓冲区中)以构建字符串。
  2. 找到第一个“ block ”后停止。
  3. 从 block 中获取您需要的信息。 (我假设您不需要整个东西,您只是想从中得到一些东西?)。
  4. 继续读取 html(从 #1 处重新开始),将其读入同一个字符串变量中,以便第一个 block 可以被垃圾收集。

如果您能以这种方式实现您的解决方案,那么您的问题就应该消失。

关于.net - 抛出了 'System.OutOfMemoryException' 类型的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4907931/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com