2010-05-19 3 views
1

Я хочу прочитать огромный .txt-файл, и я получаю переполнение памяти из-за его огромного размера.Как я могу прочитать очень большой текстовый файл с помощью StreamReader?

Любая помощь?

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

Текстовый файл просто:

Line1 
Line2 
Line3 

Буквально, как это.

Я хочу загрузить текстовый файл в многострочное текстовое поле так же, как и на 100% копию.

+2

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

+0

Как мне это сделать? Я видел подобный вопрос здесь в SO, но я не могу его найти. Поиск не подходит для меня. – 2010-05-19 18:11:41

+0

@Robert Если вы опубликуете это, вы получите upvote :) – Simon

ответ

3

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

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

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

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

+0

Итак, читателю нужен вызов 'EndOfStream' для использования предыдущей строки, чтобы можно было прочитать следующую строку? Я этого не знал. Кажется немного противоречивым. –

+0

@Robert Harvey: Нет, не нужно вызывать 'EndOfStream' для использования предыдущей строки; ему просто нужно проверить, что свойство знать, когда остановиться. Проблема заключалась в том, что ОП не использовал петлю вообще; он постоянно создавал новый «StreamReader» и вызывал «ReadLine» один раз для каждого экземпляра. –

+0

А, да. Не видел этого. –

2

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

Приведен пример: C# Read Text File Containing Data Delimited By Tabs Обратите внимание на заявления ReadLine() и WriteLine().

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

+0

Роберт, он правильно читает первую строку «Line1», но не захватывает Line2 или Line3. Я пытаюсь создать буквальную копию текстового файла, форматирование и все такое. – 2010-05-19 18:17:42

+0

@ Серхио: попробуйте RichTextBox. Если файл не удивительно большой, он должен работать; RichTextBox намного лучше подходит для такого рода вещей. –

+0

Метод ReadLine() возвращает только мою первую строку снова и снова; как я могу сказать, чтобы прочитать первую строку, а затем продолжить движение? – 2010-05-19 18:22:31

3

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

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

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

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

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; 
Смежные вопросы