我有一个简单的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
是磁盘上的物理位置。
有什么建议吗?
您可以将传输大小限制为10mb。将传输数据的前几个字节用于包含有关正在传输的文件的信息,包括起始字节、结束字节、事务ID(如果您选择这样做)等。
服务器分析文件,并确定以Z=(10mb-专用空间)块发送文件所需的事务数。它从位置x(0)到y(Z-1)读取文件,并报告专用空间中的这些位置,将块发送到客户端,将x前进到=y+1并重新启动循环。
客户端将在磁盘上创建一个空白文件,向服务器请求文件,接收卡盘并将其写入专用空间中包含的位置的文件磁盘。