0

これを調べて、ほぼ理解しましたが、このランタイムエラーが1つ残っています。
私のコードは次のとおりです。

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

コードはデータをインポートしていますが、ループは壊れず、次の理由でクラッシュします。

「タイプ 'System.OutOfMemoryException' の未処理の例外が mscorlib.dll で発生しました」

ファイル全体を読み取って最後にブレークするための、外側の while ループの適切なブレーク条件は何ですか。次の行に進む必要があり、スプレッドシートの最初の行をスキップする必要があるため、これに苦労しています。どんな助けでも大歓迎です。

*更新*

lucene インデックスのドキュメントを作成しているため、文字列のリストをクリアします。ドキュメントには約 14 個のフィールドしかなく、リストが大きくなりすぎないようにします。

getword の私のコード

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

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

        return word;
    }
4

2 に答える 2

6

私はGetWord読者を前進させていないと推測しています -datalinestreamが大規模になる原因となっています。

または、ファイルが非常に大きいです。

興味がない - なぜ捨てるのですlineか?- 確かに、内側のループで読み取ろうとしているすべてのテキストが含まれていますか?

アップデート

コードのどこかに明らかに論理的な穴があるに違いありません。私の推測では、リストに-1or 0chars を追加するか、内部の文字列を追加します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して各単語をクラックし、その過程でそれらをトリミングして、末尾/先頭の空白を取り除くだけです。

于 2013-03-13T11:31:32.303 に答える
1

これにより、例外が発生する可能性があります

     while (reader.Peek() != '\r')
      {
       datalinestream.Add(GetWord(reader));
      }
于 2013-03-13T11:32:25.240 に答える