【问题标题】:OutOfMemoryException while using string.replace()使用 string.replace() 时出现 OutOfMemoryException
【发布时间】:2012-01-16 17:01:36
【问题描述】:

我正在研究 C#。我在使用string.replace(dt,"") 甚至stringbuilder.replace(dt,"") 时得到OutOfMemoryException。请问我可以知道如何克服这个问题吗?或者任何其他方式来做同样的事情?

【问题讨论】:

  • 你能详细说明你的代码吗?
  • 感谢您的回复...我的问题是我正在使用大量数据...所以在替换时遇到问题...

标签: c#


【解决方案1】:

由于您的数据如此庞大,因此您不应该尝试一次全部操作。而是读取卡盘,处理它,然后将其写入磁盘并移动到下一个块。

这是一些代码(未经测试):

string current = getChunk();
while (current.Length > 0)
{
    current = current.Replace(oldValue, newValue);
    string toSave = current.Substring(0, current.Length - oldValue.Length);
    saveToFile(toSave);
    current = current.Substring(current.Length - oldValue.Length) + getChunk();
}

我不保存最后一个 oldValue.Length 因为有可能替换可能在一个块的一半和另一个块的一半。注意:该代码中可能存在错误,但非常接近。

【讨论】:

    【解决方案2】:

    您的字符串可能太大,内存管理器无法为新字符串找到连续的内存块。

    您需要优化程序以获得更有效的内存管理。

    【讨论】:

    • 感谢您的回复 ....是的,我用于替换的字符串有大量数据.....你能建议我用其他方法来做同样的事情吗
    • 不应为 StringBuilder 重新分配连续的内存块,因为替换不会增加原始字符串的长度。查看链接stackoverflow.com/questions/287842/…了解更多信息
    • 以较小的块处理循环内的字符串。
    • Rashmi Pandit:如果 stringbuilder 的容量超过了它的容量,它需要重新分配它的内部缓冲区。
    猜你喜欢
    • 2012-08-09
    • 2018-03-25
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2020-02-10
    • 1970-01-01
    相关资源
    最近更新 更多