大きなテキストドキュメントを作成する必要があります。現在、StringBuilder
を使用してドキュメントを作成し、File.WriteallText(filename,sb.ToString)
を呼び出しています。残念ながら、これはメモリ不足の例外をスローし始めています。
StringBuilder
をファイルにストリーミングするためのより良い方法はありますか、それとも私が使用すべき他のテクニックはありますか?
StringBuilder
を使用する代わりに、TextWriter
(APIはほぼ同じですが、ファイルを含む多数の基になる宛先に書き込むことができます)を使用してみてください。
using(TextWriter writer = File.CreateText(path))
{
// loop etc
writer.Write(...);
}
より一般的には、ファイルについて知っているコードを、データの書き込み方法について知っているコードから分離する価値があります。
using(var writer = File.CreateText(path))
{
Serialize(writer);
}
...
void Serialize(TextWriter writer)
{
...
}
これにより、さまざまなターゲットへの書き込みが簡単になります。たとえば、メモリ内でも実行できるようになりました。
var sw = new StringWriter();
Serialize(sw);
string text = sw.ToString();
重要なのは、別のターゲットに対応するためにSerialize
コードを変更する必要がないことです。これは、ネットワークに直接書き込むことも、圧縮/暗号化ストリームを介して書き込むこともできます。非常に用途が広い。
StreamWriter
に書き込むFileStream
を使用するだけです。
using (StreamWriter writer = new StreamWriter("filename.txt")) {
...
}
もちろん、これは、StringBuilder
でできるように、すでに書かれているテキストを変更できないことを意味しますが、とにかくそれを使用していないと思います。
ストリームに直接ストリーミングしてみませんか? TextWriter を使用できます。
StreamWriterを使用して、ファイルに直接書き込むことができます。