读取字符串并用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();
}
好吧,您主要的读写代码只需要一行数据。另一方面,您的msg
字符串在每次出现异常时都会变得越来越大。
不过,你需要在文件夹中有数百万个文件才能以这种方式获得OutOfMemory异常。