2013-03-13 3 views
0

에서 메모리 부족 오류가 발생했습니다.이 문제가 발생하여 거의 발생했지만이 오류가 하나 남았습니다. 때문에 시스템 '유형의 다음중첩 루프 C#

"처리되지 않은 예외에

while ((line = reader.ReadLine()) != null) 
{ 
    while (reader.Peek() != '\r') 
    { 
     datalinestream.Add(GetWord(reader)); 
    } 
    LuceneDB.AddUpdateLuceneIndex(new MATS_Doc(datalinestream)); 
    datalinestream.Clear(); 
} 

이 코드는 데이터를 가져 오는 있지만 루프가 중단되지 않고 밖으로 충돌합니다 :
내 코드는 다음과 같다. 에서 OutOfMemoryException은 '루프 내가 전체 파일을 읽을 수 있도록하고 마지막에 휴식하는 동안 외부에 대한 적절한 휴식 조건은 무엇

"가 mscorlib.dll에서 발생했습니다. 다음 줄로 넘어갈 필요가 있으므로 스프레드 시트의 첫 번째 줄을 건너 뛰어야하므로이 작업에 어려움을 겪습니다. 어떤 도움을 많이 주셨습니다.

* UPDATE *

나는 내가 루씬 지수에 대한 문서를 만드는 오전부터 문자열 목록을 삭제하고 만 약 14 필드를 가지고 있는데이 목록이 너무 싶어하지 않는다 큰. 대규모 얻을 수있는 datalinestream의 원인 - getword

private string GetWord(TextReader inputdata) 
     { 
      String word = ""; 

      while (inputdata.Peek() >= 0) 
      { 
       word += (char)inputdata.Read(); 
       if ((word.Contains(";"))) break; 
      } 

     return word; 
    } 
+5

는'GetWord'는 무엇을 하는가가 발생할 수 있습니다? 파일의 크기는 얼마입니까? –

+0

내 파일은 15kb로 매우 작습니다. 50 줄의 세미 콜론으로 구분됩니다. 코드가 실행되고 어떻게 든 달라 붙는 것처럼 멈 춥니 다. – TheCodeNovice

답변

6

내가 GetWord가 독자를 진행하지 않습니다 같은데요 대한

내 코드입니다.

파일이 너무 많습니다.

관심 분야 - 왜 line을 던집니까? - 틀림없이 내부 루프에서 읽으려고하는 모든 텍스트가 포함되어 있습니까?

업데이트하는 것은

분명이 코드에서 어딘가에 논리 구멍을, 그리고 내 생각은 하나 사용 방법에 의해 (목록 또는 GetWord의 내부 문자열로 -1 또는 0 문자를 추가하는 것입니다해야한다 이 방법으로 문자열상의 +=은 성능과 메모리 사용에 지장이 있습니다.) 또한 라인 종단 기호가 \r이 아니지만 '벌거 벗은 것'\n 일 수 있습니다. 이 스트립 사실을 악용, 사용 - 멀리 당신이 방금 읽은 그 라인을 포기하지 않는다면 - 내가 말하는대로

string line = reader.ReadLine(); 
string wordTemp; 
while(line != null) 
{ 
    string[] words = 
    line.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); 
    foreach(var word in words) 
    { 
    wordTemp = word.Trim(); //get rid of any whitespace 
    if(wordTemp.Length != 0) 
     datalinestream.Add(wordTemp); 
    } 
    LuceneDB.AddUpdateLuceneIndex(new MATS_Doc(datalinestream)); 
    datalinestream.Clear(); 
    line = reader.ReadLine(); 
} 

:이처럼 수행하여 모든 문제를 해결할 수 있다고

, 개보수도. 그런 다음 간단히 string.Split을 사용하여 각 단어를 추출하고, 처리 과정에서 줄이 쳐져 공백이있는 문자를 제거하십시오.

+0

예 -하지만 GetWord()가 코드를 진행하지 않으면 '! ='\ r'' 검사가 코드를 내부 루프에 유지합니다. –

+0

나는 당신이 무엇을 얻고 있는지 보았습니다. 조건이 참이되는 동안 내면을 멈추게하는 것은 없습니다. – Jodrell

+0

나는 실제로 프로그램에 정보를 얻은 이후로 getword가 올바르게 작동한다고 생각합니다. 휴식은 작동하지 않습니다. 따라서 가져온 후에 픽업을 다시 시작해야합니다. – TheCodeNovice

1

이 예외

 while (reader.Peek() != '\r') 
     { 
     datalinestream.Add(GetWord(reader)); 
     } 
+0

코드가 잘 실행되면 외부 while 루프를 빠져 나갈 수 없습니다. 파일에서 모든 데이터를 읽을 수 있습니다. 파일의 끝 부분에 도달했을 때 깨는 방법이 필요하며 결국 45 초 걸리는 걸로 런타임 오류가 발생합니다. – TheCodeNovice