【问题标题】:OutofMemory Exception when reading and replacing strings with StreamReader and StreamWriter使用 StreamReader 和 StreamWriter 读取和替换字符串时出现 OutofMemory 异常
【发布时间】:2014-06-13 06:54:11
【问题描述】:

我正在尝试转换文件的编码并在此过程中替换一些文本。不幸的是,我遇到了 OutOfMemory 异常。我不确定为什么。据我了解,它将原始文件逐行流式传输到 var (str) 中,完成几个字符串替换,然后将转换后的行写入 StreamWriter。

谁能告诉我我在这里做错了什么?

编辑 1 - 我目前正在测试一个文件 - 1GB:2.5m 行。 - 将读取和替换替换为一行。结果一样!

编辑 2

???顺便问一下,谁能告诉我为什么这个问题被降级了?我想知道以后的帖子。???

问题在于文件本身。它是 SQL Server BCP 的输出,我在其中使用特定字符串显式标记行终止符。默认情况下,当省略行终止符标志时,BCP 在每行的末尾添加一个换行符,下面的代码可以完美运行。

我仍然不明白的是:当我使用特定字符串设置行终止符标志时,每条记录都会出现在换行符上,那么为什么流式阅读器不会在单独的行上看到每条记录?相反,它似乎将整个文件视为一长行。这仍然不能解释 OOM 异常,因为我有超过 100G 的内存。

不幸的是,显式设置行终止标志是必须的。现在,我将把它交给 dba exchange。

谢谢

static void Main(string[] args)
    {           
        String msg = String.Empty;
        String str = String.Empty;
        DirectoryInfo dInfo = new DirectoryInfo(@"\\server\share");
        foreach (var f in dInfo.GetFiles())
        {
            using (StreamReader sr = new StreamReader(f.FullName, Encoding.Unicode, false))
            {
                using (StreamWriter sw = new StreamWriter(f.DirectoryName + "\\new\\" + f.Name, false, Encoding.UTF8))
                {
                    try
                    {    
                        while (!sr.EndOfStream)
                        {
                            str = sr.ReadLine().Replace("this","that");
                            sw.WriteLine(str);
                        }
                    }
                    catch (Exception e)
                    {
                        msg += f.Name + ": " + e.Message;
                    }
                }
            }
        }
        Console.WriteLine(msg);
        Console.ReadLine();                
    }

【问题讨论】:

  • 目录中的文件有多大?
  • 好吧,从这段代码来看,这不是你的答案,但 str.Replace 的输出需要分配给另一个字符串。替换不起作用。
  • @Steve - 谢谢。我将其更新为单行,但结果仍然相同。
  • 只是为了隔离问题。如果您删除替换,您仍然有问题吗?

标签: c# streamreader streamwriter


【解决方案1】:

嗯,你主要是读写代码只需要一行数据。另一方面,您的 msg 字符串会随着每个异常而变得越来越大。

不过,您需要在文件夹中有数百万个文件才能以这种方式获得 OutOfMemory 异常。

【讨论】:

  • 确实!但是,如果我的代码是正确的,那么异常就会少之又少。
  • 你有很多例外吗?
  • 不!只是杀死它的那个。
  • 进程的内存使用量是多少?你可能不得不去找 John Robbins 并使用 windbg。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-06
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多