2013-03-13 4 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 *

очистить список строк, так как я создаю документ для индекса Lucene, и он имеет только около 14 полей в нем, и я не хочу список, чтобы получить слишком большой.

Мой код 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

Мой файл довольно маленький 15 kb. его только, как 50 строк с разделителями с двумя двоеточиями. Код работает, и он зависает, как будто он как-то застрял. – TheCodeNovice

ответ

6

Я предполагаю, GetWord не продвигается читателя - вызвавшего datalinestream получить массовый характер.

Или ваш файл действительно массивный.

Из интереса - почему вы выбрасываете line? - уверен, что содержит весь текст, который вы пытаетесь прочитать во внутреннем цикле?

Update

Там должны четко быть логическое отверстие где-то в вашем коде, и я думаю, это либо добавление -1 или 0 символов в списке, или внутренней строки в GetWord (кстати, с использованием += на строках таким образом ужасен для производительности и использования памяти). Также может быть, что ваши терминаторы линии не \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

Смежные вопросы