Как я могу прочитать очень большой текстовый файл с помощью StreamReader? - PullRequest
1 голос
/ 19 мая 2010

Я хочу прочитать огромный файл .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 ]

3 голосов
/ 19 мая 2010

Вы получите намного более высокую производительность со следующими параметрами:

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

Это также может помочь решить проблему с памятью, так как вы тратите огромное количество памяти, выделяя последовательно большие строки с каждой прочитанной строкой.

Конечно, сборщик мусора должен собрать более старые строки, прежде чем вы увидите OutOfMemoryException, но я бы в любом случае дал вышеупомянутый шанс.

3 голосов
/ 19 мая 2010

Во-первых, код, который вы разместили, поместит только первую строку файла в TextBox. То, что вы хотите, это:

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

Теперь что касается OutOfMemoryException: я не проверял это, но вы пробовали метод TextBox.AppendText вместо использования +=? Последний, безусловно, будет выделять тонну строк, большая часть которых будет почти равна длине всего файла к тому времени, когда вы приблизитесь к концу файла.

Насколько я знаю, AppendText делает то же самое; но его существование заставляет меня подозревать, что его положили туда, чтобы справиться с этим сценарием. Я могу ошибаться - как я уже сказал, лично не проверял.

2 голосов
/ 19 мая 2010

Сначала используйте расширенное текстовое поле вместо обычного текстового поля. Они намного лучше оснащены для больших объемов данных, которые вы используете. Однако вам все равно нужно прочитать данные в.

// 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;
2 голосов
/ 19 мая 2010

Читайте и обрабатывайте его по одной строке за раз или разбивайте на куски и разбирайте их по отдельности. Вы также можете показать нам код, который у вас есть, и рассказать, что вы пытаетесь сделать с его помощью.

Вот пример: C # Считывание текстового файла, содержащего данные, разделенные вкладками Обратите внимание на операторы ReadLine() и WriteLine().

TextBox строго ограничен количеством символов, которые он может содержать. Вместо этого вы можете попробовать использовать метод AppendText() для RichTextBox.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...