如何发送文件而不必担心内存碎片?

时间:2016-04-29 22:24:06

标签: vb.net memory-management downloadfile memory-fragmentation

我有一个简单的VB.NET Web应用程序,允许用户下载服务器硬盘上的特定文件。但是,其中一些文件非常大,最大可达1GB。有时,当Web应用程序尝试发送这些文件时,应用程序会跳出并抛出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 个答案:

答案 0 :(得分:0)

这对于评论部分来说太长了,所以它是一个答案。虽然没有输入任何代码.sry。

您可以将传输大小限制为10mb。专门用于传输数据的前几个字节,以包含有关正在传输的文件的信息,包括开始字节,结束字节,事务ID(如果您选择这样做)等。

服务器分析文件并确定在Z =(10mb - 专用空间)块中发送文件所需的事务数。 它将文件从位置x(0)读取到y(Z-1)并在专用空间中报告这些位置,将块发送到客户端,将x前进到= y + 1并重新启动循环。

客户端将在磁盘上创建一个空白文件,从服务器请求文件,接收chuck并将其写入专用空间中包含的位置的文件磁盘。