如何在C#中避免OutOfMemory异常?

5
我有几个超过1GB的巨大XML文件,需要进行一些筛选操作。我想到最简单的方法是将它们保存为txt文件,然后使用ReadAllText函数读取它们,并开始进行一些操作,例如:
  var a = File.ReadAllText("file path");
  a = a.Replace("<", "\r\n<");

但是,当我尝试这样做时,程序会因内存不足而崩溃。我在运行程序时查看了我的任务管理器,RAM使用率上升到50%,一旦达到此值,程序便死亡。

有没有人有任何关于如何操作此文件以避免OutOfMemory异常或允许程序使用更多内存的想法呢?


4
使用流(streams),而不是字符串(strings)。 - Wai Ha Lee
阅读这个帖子似乎与你的问题相似:https://dev59.com/EWUo5IYBdhLWcg3wxB7T - Dhaval Pankhaniya
你的 ReadAllText 读取了整个文件的一个副本,然后 Replace 创建了第二个副本。 - Hans Kesting
2
如果您在两个文件之间比较XML元素,那么更没有理由将XML视为文本,因为两个XML元素可能具有不同的文本表示形式(例如自闭合标签与开放-关闭标签),同时具有相同的内容。 - Evk
1
除了 Evks 的例子之外,语义上 <a:thing xmlns:a="urn:123"/><b:thing xmlns:b="urn:123"/> 也是相同的。 - Damien_The_Unbeliever
显示剩余5条评论
1个回答

6
如果你可以逐行处理,而不是使用File.ReadAllText来读取整个文件到内存中,你可以使用File.ReadLines来逐行读取。

这将返回一个使用延迟执行的IEnumerable。你可以这样做:

using(StreamWriter sw = new StreamWriter(newFilePath))
foreach(var line in File.ReadLines(path))
{
    sw.WriteLine(line.Replace("<", "\r\n<"));
}

如果你想了解更多关于延迟执行的内容,你可以查看this的 GitHub 页面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接