Вы смотрите на оперативную память, используемую самим процессом? Я не ожидал бы, что это пойдет вниз. Процесс будет зависать от этой памяти и использовать ее для дальнейшего распределения. Он не передает его обратно в операционную систему. Так работает .NET.
Вы можете потенциально заставить его отбросить память с помощью некоторого вызова CLR API - но обычно я бы не стал.
Это не означает, что память действительно просочилась - она все еще может использоваться тем же процессом. Например, если вы снова выполнили то же действие, вероятно, не потребуется увеличивать размер кучи - вы увидите, что использование памяти останется неизменным на уровне процесса. Используйте графы CLR perfmon для просмотра памяти, используемой в управляемой куче, чтобы определить, есть ли подлинная утечка.
(Существует также различная мера того, сколько памяти фактически использует приложение. Какая из них интересна, зависит от того, что вы пытаетесь сделать.)
РЕДАКТИРОВАТЬ: Если ваш фрагмент кода действительно указывает на код, который вы используете, то есть гораздо более простая альтернатива: поток данных.
using (TextWriter writer = File.CreateText("tempFile.txt"))
{
CopyText(reader, writer);
}
static void CopyText(TextReader reader, TextWriter writer)
{
char[] buffer = new char[8192];
int charsRead;
while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
{
writer.Write(buffer, 0, charsRead);
}
}
Обратите внимание, что если вы на самом деле не меняете кодировку, вы можете сделать это без использования пары TextWriter
/ TextReader
для начала.
Таким образом, вам не нужно иметь всю строку в памяти , а также ее двоичное представление (в MemoryStream
). Конечно, у вас все еще будет двоичное представление - у вас есть есть для записи всего в MemoryStream
для начала?