10

ストリームを byte[] 'raw' としてダウンロードしました。これは約 36MB です。次に、それを文字列に変換します

string temp = System.Text.Encoding.UTF8.GetString(raw)

次に、すべての「\n」を「\r\n」に置き換える必要があるので、試しました

 string temp2 = temp.Replace("\n","\r\n")

しかし、「メモリ不足」の例外がスローされました。次に、StringBuilder を使用して新しい文字列を作成しようとしました。

string temp2 = new StringBuilder(temp).Replace("\n","\r\n").toString()

例外をスローしませんでした。そもそもメモリの問題が発生するのはなぜですか (ここでは 36MB しか扱っていません)、なぜ StringBuilder.Replace() が機能しないのに機能するのでしょうか?

4

4 に答える 4

1

メモリ プレッシャの概念があります。つまり、作成される一時オブジェクトが多いほど、ガベージ コレクションが頻繁に実行されます。

そのため、StringBuilder は一時オブジェクトの作成を減らし、メモリ負荷を軽減します。

StringBuilder メモリ

交換

次に StringBuilder を使用して、ループ内の文字を置き換えます。最初に文字列を StringBuilder に変換してから、StringBuilder のメソッドを呼び出します。これは高速です — StringBuilder 型は内部で文字配列を使用します

于 2013-05-14T09:45:02.757 に答える
0

C# では文字列は不変です。string.replace() メソッドを使用すると、システムは置換ごとに String オブジェクトを作成します。StringBuilder クラスは、オブジェクトの作成を回避するのに役立ちます。

于 2013-05-14T09:42:17.467 に答える