Я пытаюсь передать содержимое файла.
Код работает для файлов меньшего размера, но для файлов большего размера возникает ошибка «Недостаточно памяти».
public void StreamEncode(FileStream inputStream, TextWriter tw)
{
byte[] base64Block = new byte[BLOCK_SIZE];
int bytesRead = 0;
try
{
do
{
// read one block from the input stream
bytesRead = inputStream.Read(base64Block, 0, base64Block.Length);
// encode the base64 string
string base64String = Convert.ToBase64String(base64Block, 0, bytesRead);
// write the string
tw.Write(base64String);
} while (bytesRead == base64Block.Length);
}
catch (OutOfMemoryException)
{
MessageBox.Show("Error -- Memory used: " + GC.GetTotalMemory(false) + " bytes");
}
}
Я могу выделить проблему и наблюдать, как используемая память растет по мере зацикливания.
Кажется, проблема в вызове Convert.ToBase64String()
.
Как освободить память для преобразованной строки?
Отредактировано отсюда вниз ... Вот обновление.
Я также создал новую ветку об этом - извините, я думаю, это было неправильно.
Спасибо за ваши замечательные предложения. Из предложений я сократил размер буфера, используемого для чтения из файла, и похоже, что потребление памяти лучше, но я все еще вижу проблему с OOM, и я вижу эту проблему с файлами размером до 5 МБ. Я потенциально хочу иметь дело с файлами в десять раз больше.
Кажется, моя проблема сейчас связана с использованием TextWriter.
Я создаю запрос следующим образом [с несколькими правками, чтобы уменьшить код]:
HttpWebRequest oRequest = (HttpWebRequest)WebRequest.Create(new Uri(strURL));
oRequest.Method = httpMethod;
oRequest.ContentType = "application/atom+xml";
oRequest.Headers["Authorization"] = getAuthHeader();
oRequest.ContentLength = strHead.Length + strTail.Length + longContentSize;
oRequest.SendChunked = true;
using (TextWriter tw = new StreamWriter(oRequest.GetRequestStream()))
{
tw.Write(strHead);
using (FileStream fileStream = new FileStream(strPath, FileMode.Open,
FileAccess.Read, System.IO.FileShare.ReadWrite))
{
StreamEncode(fileStream, tw);
}
tw.Write(strTail);
}
.....
Что вызывает в рутине:
public void StreamEncode(FileStream inputStream, TextWriter tw)
{
// For Base64 there are 4 bytes output for every 3 bytes of input
byte[] base64Block = new byte[9000];
int bytesRead = 0;
string base64String = null;
do
{
// read one block from the input stream
bytesRead = inputStream.Read(base64Block, 0, base64Block.Length);
// encode the base64 string
base64String = Convert.ToBase64String(base64Block, 0, bytesRead);
// write the string
tw.Write(base64String);
} while (bytesRead !=0 );
}
Должен ли я использовать что-то кроме TextWriter из-за потенциально большого контента? Кажется, очень удобно создавать всю полезную нагрузку запроса.
Это совершенно неправильный подход? Я хочу иметь возможность поддерживать очень большие файлы.