1

我想读取一个巨大的 .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

4 回答 4

3

通过以下方式,您将获得更快的性能:

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

它也可能有助于解决您的内存问题,因为您通过在读取每一行时分配连续更大的字符串来浪费大量内存。

诚然,GC 应该在您看到 之前收集较旧的字符串OutOfMemoryException,但无论如何我都会试一试。

于 2010-05-19T18:15:43.673 回答
3

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

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

现在至于OutOfMemoryException:我还没有测试过这个,但是你有没有尝试过这个TextBox.AppendText方法而不是使用+=?后者肯定会分配大量字符串,当您接近文件末尾时,其中大部分将接近整个文件的长度。

据我所知,AppendText这也是如此;但它的存在让我怀疑它被放在那里是为了处理这种情况。我可能是错的——就像我说的,没有亲自测试过。

于 2010-05-19T18:18:58.620 回答
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;
于 2010-05-19T19:26:46.510 回答
2

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

下面是一个示例:C# 读取包含由制表符分隔的数据 的文本文件 注意ReadLine()andWriteLine()语句。

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

于 2010-05-19T18:13:50.263 回答