2012-02-15 20 views
0
このコードを考える

の扱い?私はSLINE = streamReader.ReadToEnd後はSystem.OutOfMemoryExceptionに

streamReader.Dispose(); 

を追加します

+6

try catchを使用していますか?真剣に、ちょうどチャンクでそれを読んでください。一度にすべてをメモリに入れないでください。 – jadarnel27

+0

どのような理由で例外が発生しますか? ReadToEnd? –

+0

この行にエラーが表示されるsLine =(sLine.Contains( "、"))? sLine.Replace( "、"、 "\ r \ n"):sLine; –

答えて

0

(); これにより、置換処理を開始する前にメモリが解放されます。

0

私はあなたがチャンクでファイルを読み込む必要があり、以前のコメントに同意していますが、一度にメモリに全体のチャンクを読み込む必要がある場合:

String.Replace()されたが、文字列のコピーを返します。したがって、置き換えた後は、前と同じ2倍のメモリを使用しています。代わりにStringBuilder.Replace()を使用するか、実際にRAMが必要な場合は、文字列をバイト配列にロードし、文字列のインラインを操作します。 (ただし、1文字を2文字に置き換えているので、いくつかの問題があります)。

私はそれについて考えて、これを再訪します。

0

操作が完了したら、変更された文字列を使って何をする予定ですか?ファイルに書き込むだけの場合は、一度に1行ずつ読み込んで操作し、変更された行をファイルに書き込む必要があります。 StreamReaderのreadlineは\ r \ nに出会うまですべてを返します。 \ r \ nを "、"で置き換えることを計画しているので、readlineによって返された文字列にカンマを追加することができます。あなたは、あなたがStringBuilderの(sb.Appendでsw.Writeを置き換える)で文字列を構築することができ、あなたのコードの残りの部分であなたの操作テキストを使用して計画している場合

using (StreamWriter sw = new StreamWriter(Path.GetTempFileName())) 
{ 
    using (StreamReader sr = new StreamReader(@"YourFile")) 
    { 
     while (!sr.EndOfStream) 
     { 
      string line = sr.ReadLine(); 
      if (line != null) 
      { 
       sw.Write(line + ","); 
      } 
     } 
    } 
} 

。ただし、StringBuilderを使用しても、OutOfMemoryExceptionを実行しないことは保証されません。大きな文字列は大きな文字列です。文字列に連続したメモリブロックがない場合、そのOutOfMemoryExceptionを取得します。また、@ SteveCzettyが指摘するように、string.Replace()を呼び出すと、文字列のコピーが返されます。文字列が大きいほど、例外が発生する可能性が高くなります。

関連する問題