1

I want to read a huge .txt file and I'm getting a memory overflow because of its sheer size.

Any help?

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

Text file is just:

Line1
Line2
Line3

Literally like that.

I want to load the text file to a multiline textbox just as it is, 100% copy.

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

一度に1行ずつ読み取って処理するか、チャンクに分割して個別に処理します。また、お持ちのコードを表示して、それを使用して何を達成しようとしているのかを教えてください。

次に例を示します。タブで区切られたデータを含むC#読み取りテキストファイルReadLine()andWriteLine()ステートメント に注意してください。

TextBoxは、保持できる文字数によって厳しく制限されます。AppendText()代わりに、でメソッドを使用してみることができますRichTextBox

于 2010-05-19T18:13:50.263 に答える
2

First use a rich text box instead of a regular text box. They're much better equiped for the large amounts of data you're using. However you still need to read the data in.

// 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 に答える