[英]OutofMemory Exception when reading and replacing strings with StreamReader and StreamWriter
我正在嘗試轉換文件的編碼,並一路上替換一些文本。 不幸的是,我遇到了OutOfMemory異常。 我不知道為什么。 據我了解,它逐行將原始文件傳輸到var(str)中,完成了兩次字符串替換,然后將轉換后的行寫入StreamWriter。
有人可以告訴我我在做什么錯嗎?
編輯1-我目前正在測試一個文件-1GB:250萬行。 -替換讀並替換為一行。 結果一樣!
編輯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異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.