内存不足异常读写文本文件

问题描述 投票:4回答:3

执行以下代码几秒钟后,内存不足异常。在引发异常之前,它不会编写任何内容。文本文件的大小约为半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# exception out-of-memory
3个回答
1
投票

逐行读取文件,它将帮助您避免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();
        }
    } 
}

1
投票

在下面的文章中,您可以找到许多用于读取和写入大文件的方法。 Reading large text files with streams in C#

基本上,您只需要读取缓冲区中的字节即可重用。这样,您会将很少量的文件加载到内存中。


1
投票

而不是读取整个文件,请尝试逐行读取和处理。这样,您就不会冒遇到内存不足异常的风险。因为即使您成功地为程序组织了更多的内存,总有一天,文件将再次变得太大。

但是如果您使用较少的内存,该程序可能会降低速度,因此,基本上,您必须在内存使用和执行时间之间取得平衡。一种解决方法是使用缓冲的输出,一次读取多行或在多个线程中转换字符串。

© www.soinside.com 2019 - 2024. All rights reserved.