2010-05-19 4 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

어떻게하면됩니까? 그래서 비슷한 질문을 보았지만 찾을 수가 없습니다. 검색이 제대로 작동하지 않습니다. –

+0

@ 로버트 이것을 게시하면 upvote가 표시됩니다. – Simon

답변

3

먼저 게시 한 코드는 파일의 첫 번째 줄만 TextBox에 넣습니다. 당신이 원하는 것은 이것이다 :

OutOfMemoryException에 관해서는 지금
using (var reader = new StreamReader(@"C:\Test.txt")) 
{ 
    while (!reader.EndOfStream) 
     textBox1.Text += reader.ReadLine(); 
} 

:이 테스트를하지 않은,하지만 당신은 +=을 사용하는 대신 TextBox.AppendText 방법을 시도? 후자는 확실히 문자열의 톤을 할당 할 것이고, 대부분은 파일의 끝 부분 근처에서 전체 파일의 거의 길이가 될 것입니다.

내가 아는 한, AppendText도 마찬가지입니다. 그러나 그 존재는 내가이 시나리오를 다루기 위해 거기에 놓여 있다고 의심하게 만든다. 내가 잘못한 것일 수도 있습니다. 제가 말한 것처럼, 개인적으로 테스트하지 않았습니다.

+0

그래서 독자는'EndOfStream'을 호출하여 이전 라인을 소비해야하므로 다음 라인을 읽을 수 있습니까? 나는 그것을 몰랐다. 반 직관이 아닌 것 같습니다. –

+0

@Robert Harvey : 아니요. 이전 줄을 사용하려면'EndOfStream'을 호출 할 필요가 없습니다. 멈추어야 할 때를 알기 위해서는 그 속성을 체크 할 필요가 있습니다. 문제는 OP가 루프를 전혀 사용하지 않고 있다는 것이 었습니다. 그는 계속해서 새로운'StreamReader'를 만들고 인스턴스마다 한 번씩'ReadLine'을 호출하고있었습니다. –

+0

아, 네. 못 봤어. –

2

한 번에 한 줄씩 읽고 처리하거나 청크로 나누어 청크를 개별적으로 처리합니다. 가지고있는 코드를 보여줄 수 있으며, 그 코드로 수행하려는 것을 알려주십시오.

다음은 예입니다. C# Read Text File Containing Data Delimited By TabsReadLine()WriteLine() 문에 유의하십시오.

TextBox는 저장할 수있는 문자 수에 따라 심각하게 제한됩니다. 대신 RichTextBox에서 AppendText() 방법을 사용해보세요.

+0

Robert, 첫 번째 줄 "Line1"을 올바르게 읽지 만 Line2 또는 Line3을 가져 오지 않습니다. 텍스트 파일의 서식있는 복사본을 만들려고합니다. –

+0

@Sergio : RichTextBox를 사용해보십시오. 파일이 놀라 울 정도로 크지 않다면 작동 할 것입니다. RichTextBox는 이런 종류의 일에 훨씬 더 적합합니다. –

+0

ReadLine() 메서드는 첫 번째 행을 반복해서 반환합니다. 어떻게하면 첫 줄을 읽고 계속 나아가 야할까요? –

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; 
관련 문제