Как отправлять файлы, не беспокоясь о фрагментации памяти?

У меня есть простое веб-приложение VB.NET, которое позволяет пользователям загружать определенные файлы на жесткий диск сервера. Тем не менее, некоторые из этих файлов очень большие, до 1 ГБ. Иногда, когда веб-приложение пытается отправить эти файлы, приложение выкидывает и выдает System.OutOfMemoryException, После некоторых исследований я обнаружил, что это происходит из-за фрагментации памяти, или недостаточно непрерывной памяти для выделения всего файла.

Можно ли вообще избежать этой ошибки? Наш сервер имеет достаточно физической памяти для загрузки этих больших файлов, это просто проблема фрагментации памяти (из того, что я читал в Интернете в любом случае).

Для справки вот код, который в настоящее время на месте:

Public Function SendFile(ByVal fileName As String, ByVal contentType As String, ByVal fileLocation As String) As ActionResult
    Dim fileBytes as Byte() = New WebClient().DownloadData(fileLocation)
    Return File(fileBytes, contentType, fileName)
End Function

... где fileName это имя файла, contentType это тип MIME, и fileLocation это физическое местоположение на диске.

Какие-либо предложения?

1 ответ

Это было слишком долго для раздела комментариев, так что это ответ. Не помещая никакого кода, хотя.. сри.

Вы можете ограничить размер передачи до 10 МБ. Выделите первые несколько байтов переданных данных, которые будут содержать информацию о передаваемом файле, включая начальный байт, конечный байт, идентификатор транзакции (если вы решите это сделать) и т. Д.

Сервер анализирует файл и определяет, например, количество транзакций, необходимых для отправки файла в виде фрагментов Z=(10 Мб - выделенное пространство). Он считывает файл из позиции x(0) в y(Z-1) и сообщает об этих позициях в выделенном пространстве, отправляет фрагмент клиенту, увеличивает x до =y+1 и перезапускает цикл.

Клиент будет создавать пустой файл на диске, запрашивать файл с сервера, получать патрон и записывать его на файловый диск в позициях, которые содержатся в выделенном пространстве.

Другие вопросы по тегам