Мне нужно передать большие файлы между компьютерами через ненадежные соединения с помощью WCF.Memorystream and Large Object Heap
Поскольку я хочу, чтобы иметь возможность возобновить файл, и я не хочу, чтобы меня ограничивали в моем файлеize WCF, я разбиваю файлы на 1 Мб. Эти «куски» транспортируются как поток. Который работает довольно хорошо, до сих пор.
Мои шаги:
- открыт FileStream
- читать фрагмент из файла в байт [] и создать MemoryStream
- передачи кусок
- обратно 2. пока весь файл не будет отправлен
Моя проблема заключается в шаге 2. Я предполагаю, что когда я создаю поток памяти из массива байтов, он попадет на LOH и ultima за исключением исключения outofmemory. Я не мог создать эту ошибку, возможно, я ошибаюсь в своем предположении.
Теперь я не хочу отправлять байт [] в сообщение, поскольку WCF скажет мне, что размер массива слишком велик. Я могу изменить максимально допустимый размер массива и/или размер моего куска, но я надеюсь, что есть еще одно решение.
Мой актуальный вопрос (ы):
- Будет ли мое текущее решение создать объекты на LOH и что вызывает у меня проблемы?
- Есть ли лучший способ решить эту проблему?
Btw .: На стороне приема я просто читаю мелкие куски из поступающего потока и записываю их непосредственно в файл, поэтому не задействованы большие массивы байтов.
Edit:
текущее решение:
for (int i = resumeChunk; i < chunks; i++)
{
byte[] buffer = new byte[chunkSize];
fileStream.Position = i * chunkSize;
int actualLength = fileStream.Read(buffer, 0, (int)chunkSize);
Array.Resize(ref buffer, actualLength);
using (MemoryStream stream = new MemoryStream(buffer))
{
UploadFile(stream);
}
}
Большое спасибо! Это серьезный ответ на бриллиантов. Спасибо, что указали на проблему Array.Resize. Я также никогда не слышал о BufferManager, похоже, что это поможет мне и в других областях. Это намного больше, чем я ожидал, поэтому я подумал о том, чтобы начать небольшую щедрость и дать ее вам, но я должен ждать 23 часа после начала щедрости ...Так что вам тоже нужно подождать :) – flayn
Спасибо за это. Я очень рад, что могу помочь. Дайте мне знать, если что-нибудь еще. Оглядываясь назад, возможно, стоит отметить, что оптимальная реализация будет иметь один экземпляр BufferManager для всей службы. Я не знаю, насколько это практично для вас. –
+1 Просто наткнулся на этого, ища ответ на подобную проблему. Никогда раньше не слышал о BufferManager - удивительный! Думаю, это будет что-то, что нужно запомнить в будущем. –