2012-08-07 2 views
-1

예측할 수없는 큰 파일을 구문 분석하는 프로그램을 작성하고 있습니다. 이 부분에는 아무런 문제가 없습니다. 아래의 코드를 사용하여 문서 끝까지 ReadLine을 반복하여 메모리 사용량을 줄입니다. 내 문제는 라인이 너무 길 때 OutOfMemoryException입니다.C# 블록 구현 읽기

System.IO.StreamReader casereader = new System.IO.StreamReader(dumplocation); 
string line; 
while ((line = casereader.ReadLine()) != null) 
{ 
    foreach (Match m in linkParser.Matches(line)) 
    { 
     Console.Write(displaytext); 
     Console.WriteLine(m.Value); 
     XMLWrite.Start(m.Value, displaytext, dumplocation, line); 
    } 
} 

XMLWrite는 XML 문서에 내 Regex 기능과 일치하는 문자열을 쓰고 있습니다. Regex 함수는 간단한 전자 메일 검색입니다. 이 문제는 ReadLine이 호출되고 응용 프로그램이 내가 읽고있는 파일에서 매우 긴 행을 찾을 때 발생합니다.이 파일은 작업 관리자에서 올라가고 '문자열'을 채우는 것처럼 올라갑니다. 결국에는 메모리가 부족하여 충돌이 발생합니다. 내가하고 싶은 일은 사전 정의 된 블록 (예 : 8,000 자)을 읽은 다음 동일한 프로세스를 통해 한 번에 하나씩 실행하는 것입니다. 이것은 문자열 행 (8,000 자)의 길이를 항상 알고 있으므로 메모리 예외를 수신하거나 저장하지 않아야 함을 의미합니다. 내 논리는 논리처럼 보입니까!? ReadBlock을 구현하는 가장 좋은 방법을 찾고 있는데 현재로서는 작동하지 않습니다.

많은 도움을 주셨습니다.

+1

* 여전히 메모리 부족 문제가 있습니까? 그렇지 않다면, 귀하의 질문은 무엇입니까? 첫 번째 코드 블록에 OOM 문제가 있고 미리 정의 된 블록을 읽으면이를 수정한다는 것을 의미합니다. –

+0

그리고 무슨 일 이니? 오류? –

+0

어떤 오류가 발생합니까? 당신이 가지고있는 문제는 무엇입니까? Visual Studio에서 코드를 시도하지는 않았지만 논리가 좋았습니다 ... 컴파일러가 불평입니까? –

답변

1

당신이 코드를

  using (StreamReader sr = new StreamReader(yourPath)) 
      { 
       //This is an arbitrary size for this example. 
       char[] c = null; 

       while (sr.Peek() >= 0) 
       { 
        c = new char[5];//Read block of 5 characters 
        sr.Read(c, 0, c.Length); 
        Console.WriteLine(c); //print block 
       } 
      } 

링크 시도 할 수 있습니다 : (http://msdn.microsoft.com/en-us/library/9kstw824.aspx

+0

이 예를 살펴 보았지만이를 구현 한 행운은 없었습니다. 고마워요. –

+0

도와 드리겠습니다. –

+0

@BenCollins 약간의 노력을 보여주세요. 그 간단한 예제는 어디에서 실패 했습니까? – Paparazzi

1

라인 = buffer.ToString을); 이 진술은 비난 받아야합니다. buffer는 char 배열이며 ToString() 메서드는 System.char []를 반환합니다.

-1

사용 : line = new string (buffer); 대신