【问题标题】:How to send files without worrying about memory fragmentation?如何发送文件而不用担心内存碎片?
【发布时间】:2016-08-25 04:57:44
【问题描述】:

我有一个简单的 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 是磁盘上的物理位置。

有什么建议吗?

【问题讨论】:

  • 通过HttpWebRequest等分块下载?

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 2010-09-08
    • 1970-01-01
    • 2010-10-26
    • 2013-10-17
    • 2018-09-25
    • 2012-12-11
    • 2011-01-17
    • 2020-02-15
    相关资源
    最近更新 更多