读取字符串并用StreamReader和StreamWriter替换字符串时发生内存外异常

本文关键字:字符串 异常 替换 内存 StreamWriter 串并 字符 StreamReader 读取 | 更新日期: 2023-09-27 18:00:29

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

有人能告诉我我在这里做错了什么吗?

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

编辑2

顺便问一下,有人能告诉我为什么这个问题被降级了吗?我想知道未来的职位。???

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

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

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

感谢

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();                
    }

读取字符串并用StreamReader和StreamWriter替换字符串时发生内存外异常

好吧,您主要的读写代码只需要一行数据。另一方面,您的msg字符串在每次出现异常时都会变得越来越大。

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