簡體   English   中英

內存不足異常讀寫文本文件

[英]Out of memory exception reading and writing text file

執行以下代碼幾秒鍾后,我收到內存不足異常。 在拋出異常之前它不會寫任何東西。 文本文件的大小約為 0.5 GB。 我正在編寫的文本文件最終將占用大約 3/4 GB 的空間。 有什么技巧可以繞過這個異常嗎? 我認為這是因為文本文件太大。

public static void ToCSV(string fileWRITE, string fileREAD)
{
    StreamWriter commas = new StreamWriter(fileWRITE);
    var readfile = File.ReadAllLines(fileREAD);


    foreach (string y in readfile)
    {

        string q = (y.Substring(0,15)+","+y.Substring(15,1)+","+y.Substring(16,6)+","+y.Substring(22,6)+ ",NULL,NULL,NULL,NULL");
        commas.WriteLine(q);
    }

    commas.Close();
}

我已將代碼更改為以下代碼,但仍然得到相同的異常?

public static void ToCSV(string fileWRITE, string fileREAD)
{
    StreamWriter commas = new StreamWriter(fileWRITE);

    using (FileStream fs = File.Open(fileREAD, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    using (BufferedStream bs = new BufferedStream(fs))
    using (StreamReader sr = new StreamReader(bs))
    {
        string y;
        while ((y = sr.ReadLine()) != null)
        {
            string q = (y.Substring(0, 15) + "," + y.Substring(15, 1) + "," + y.Substring(16, 6) + "," + y.Substring(22, 6) + ",NULL,NULL,NULL,NULL");
            commas.WriteLine(q);
        }
    }

    commas.Close();
}

在下面的文章中,您可以找到多種讀取和寫入大文件的方法。 在 C# 中使用流讀取大型文本文件

基本上,您只需要讀取將被重用的緩沖區中的字節。 這樣您就可以將非常少量的文件加載到內存中。

不要讀取整個文件,而是嘗試逐行讀取和處理 這樣您就不會冒遇到內存不足異常的風險。 因為即使您成功地為程序組織了更多內存,總有一天文件會再次變得太大。

但是如果您使用較少的內存,程序可能會降低速度,因此基本上您必須平衡內存使用和執行時間。 一種解決方法是使用緩沖輸出,一次讀取多於一行或在多個線程中轉換字符串。

逐行閱讀文件,它將幫助您避免OutOfMemoryException 我個人更喜歡使用using來處理流。 它確保在出現異常時關閉文件。

public static void ToCSV(string fileWRITE, string fileREAD)
{
    using(var commas = new StreamWriter(fileWRITE))
    using(var file = new StreamReader("yourFile.txt"))
    {
        var line = file.ReadLine();

        while( line != null )
        { 
            string q = (y.Substring(0,15)+","+y.Substring(15,1)+","+y.Substring(16,6)+","+y.Substring(22,6)+ ",NULL,NULL,NULL,NULL");
            commas.WriteLine(q);
            line = file.ReadLine();
        }
    } 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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