压缩文件时限制内存使用

时间:2012-09-28 15:43:29

标签: c# asp.net .net

我目前使用ionic来压缩许多照片,然后通过浏览器将它们发送给用户。基本上是这样的。

using (ZipFile zipFile = new ZipFile())
{
      byte[] data = client.DownloadData("photo.png");

      zipFile.AddEntry("photo.png", data);

      Response.ClearContent();
      Response.ClearHeaders();
      Response.AppendHeader("content-disposition", "attachment; filename=Media.zip");

      zipFile.Save(Response.OutputStream);
}

然而,有时会有很多照片达到15 mb并且有很多照片。

因为这样的内存被完全使用并且在它完成创建zip文件之前就用完了。有没有办法我可以完成压缩文件并将其发送给用户而不使用如此大量的内存?也许完全不同的方法?

2 个答案:

答案 0 :(得分:5)

听起来我觉得你最好把文件写到某个地方的磁盘(或数据库),理想情况是以流式方式...然后给客户端一个允许文件下载的链接 - 再次,以流媒体方式。基本上,尽量避免在任何时候都要求完整的文件存储在内存中。

答案 1 :(得分:1)

除了Jon关于将所有内容从内存和切换移动到流媒体的建议。

由于您正在谈论已经压缩的图像,因此可以采取更极端的方法:您可以直接从文件中动态创建带有非压缩文件的Zip,并立即将结果流式传输到浏览器,而无需在内存中/磁盘上创建Zip 。我不知道现有的库是否允许您这样做,或者您需要根据规范编写自己的库(请参阅Wikipedia on Zip获取链接)。

附注:从您的示例中不清楚您是否需要在请求之间存储数据,但是如果您确实考虑了文件的某些进程外存储而不是会话状态。如果处理大量数据 - 请尽可能使用IIS的x64进程。