【发布时间】: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