【问题标题】:How to get around OutOfMemory exception in C#?如何解决 C# 中的 OutOfMemory 异常?
【发布时间】:2017-11-01 07:32:43
【问题描述】:

我有一些巨大的 xml 文件,1+ gb。我需要对它们进行一些过滤操作。我想出的最简单的想法是将它们保存为 txt 和 ReadAllText ,然后开始执行一些操作,例如

  var a = File.ReadAllText("file path");
  a = a.Replace("<", "\r\n<");

但是,当我尝试这样做时,程序内存不足。我在运行它时查看了我的任务管理器,RAM 使用率上升到 50%,当它到达它时,程序就死了。

是否有人对我如何使用此文件避免 OutOfMemory 异常或允许程序占用更多内存有任何想法。

【问题讨论】:

  • 使用流,而不是字符串。
  • 替换是“过滤”,还是别的什么?无论如何,看看XmlReader。 (我认为这是正确的。)
  • 一般来说,尽量避免将 XML 视为“只是字符串”。尽可能使用设计的工具来处理 XML,除非你想要生成的不是 XML,而是“看起来像 XML 但我对它做了一些奇怪的事情从技术上讲,它不再是 XML”
  • 如果您比较两个文件之间的 xml 元素 - 更没有理由将 xml 视为文本,因为两个 xml 元素可能具有不同的文本表示形式(如自闭合标签与开闭标签),但具有相同的内容。
  • 并添加到 Evks 示例中,语义 &lt;a:thing xmlns:a="urn:123"/&gt;&lt;b:thing xmlns:b="urn:123"/&gt; 也相同。

标签: c#


【解决方案1】:

如果您可以逐行执行,而不是使用File.ReadAllText 说“读取所有内容”,您可以使用File.ReadLines 说“每次让我一行”。

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

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

如果你想了解更多关于延迟执行的信息,可以查看thisgithub页面。

【讨论】:

    猜你喜欢
    • 2016-05-17
    • 2015-07-28
    • 2016-12-16
    • 2022-08-07
    • 1970-01-01
    • 2013-08-02
    • 2011-02-16
    • 2023-04-03
    • 2019-07-15
    相关资源
    最近更新 更多