簡體   English   中英

使用StreamReader和StreamWriter讀取和替換字符串時出現OutofMemory異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM