如何使用StreamReader读取非常大的文本文件?

时间:2010-05-19 18:09:18

标签: c# streamreader .net

我想读一个巨大的.txt文件,因为它的大小,我得到了内存溢出。

任何帮助?

    private void button1_Click(object sender, EventArgs e)
    {
        using (var Reader = new StreamReader(@"C:\Test.txt"))
        {
            textBox1.Text += Reader.ReadLine();
        }
    }

文本文件只是:

Line1
Line2
Line3

字面意思就是这样。

我想将文本文件加载到多行文本框中,100%复制。

4 个答案:

答案 0 :(得分:3)

使用以下内容可以获得更快的性能:

textBox1.Text = File.ReadAllText(@"C:\Test.txt");

它也可能对你的内存问题有所帮助,因为你通过在每行读取时连续分配较大的字符串来浪费大量内存。

当然,GC应该在您看到OutOfMemoryException之前收集较旧的字符串,但无论如何我都会给出上面的镜头。

答案 1 :(得分:3)

首先,您发布的代码只会将文件的第一行放入TextBox。你想要的是这个:

using (var reader = new StreamReader(@"C:\Test.txt"))
{
    while (!reader.EndOfStream)
        textBox1.Text += reader.ReadLine();
}

现在OutOfMemoryException:我没有对此进行过测试,但您是否尝试过使用TextBox.AppendText方法而不是+=?后者肯定会分配大量的字符串,当你接近文件末尾时,大多数字符串几乎都是整个文件的长度。

据我所知,AppendText也是这样做的;但它的存在让我怀疑它是用来处理这种情况的。我可能错了 - 就像我说的那样,没有亲自测试过。

答案 2 :(得分:2)

一次读取并处理一行,或将其分成块并单独处理块。您还可以向我们展示您拥有的代码,并告诉我们您要使用它完成的任务。

以下是一个示例:C# Read Text File Containing Data Delimited By Tabs请注意ReadLine()WriteLine()语句。

TextBox受其可容纳的字符数严重限制。您可以尝试在RichTextBox上使用AppendText()方法。

答案 3 :(得分:2)

首先使用富文本框而不是常规文本框。对于您正在使用的大量数据,它们要好得多。但是,您仍然需要读取数据。

// use a string builer, the += on that many strings increasing in size
// is causing massive memory hoggage and very well could be part of your problem
StringBuilder sb = new StringBuilder();

// open a stream reader
using (var reader = new StreamReader(@"C:\Test.txt"))
{
    // read through the stream loading up the string builder
    while (!reader.EndOfStream)
    {
       sb.Append( reader.ReadLine() );
    }
}

// set the text and null the string builder for GC
textBox1.Text = sb.ToString();
sb = null;