首页 新闻 会员 周边 捐助

汇出压缩档ZipArchive_System.OutOfMemoryException

0
悬赏园豆:10 [已解决问题] 解决于 2020-08-19 23:06

请教一下各位先进:
  我需要将server上的文件整批汇出一个压缩档给user操作使用,整批实体文件大小约1.5G以下,整批汇出时遇到已发生类型 'System.OutOfMemoryException' 的例外状况,查看server的内存状况,落在12GB以上,server共有16G内存可用,将server重开后,占用内存约8.5GB,执行整批汇出功能测试内存并没有往上冲至12G,最高大约落在9.5GB,程式依然报System.OutOfMemoryException,初步判断不是server 内存不够问题。
想请问这样的压缩档整批汇出功能,有文件大小的限制吗?可以突破文件大小的限制吗?
先谢谢了~

public ActionResult ExportPapersZip(PaperViewModel PV)
{
    var ms = new MemoryStream();
    FileStream sFile;
    string FileName = "";
    byte[] toBytes;
    List<ConferencePaperFilesViewModel> cpfVM = new List<ConferencePaperFilesViewModel>();
    cpfVM = fileSrv.GetConferencePaperFilesList(PV.ConferenceId, 5);
    using (var archive = new System.IO.Compression.ZipArchive(ms, ZipArchiveMode.Create, true))
    {
        cpfVM.ForEach(x =>
        {
            try
            {
                string MemberName = memberSrv.GetMemberName(x.MemberId);
                string TrackName = conferenceSrv.GetTrackTitle(x.TrackId);
                string SubFileName = Path.GetExtension(x.OriginalFileName).ToLower();
                sFile = new FileStream(x.SysPath + x.OriginalFileName, FileMode.Open, FileAccess.Read);
                toBytes = fileSrv.BinaryReadToEnd(sFile);
                if(x.CleanTitle == null)
                {
                    FileName = x.paperId.ToString();
                }
                else
                {
                    FileName = x.CleanTitle;
                }
                var zipEntry = archive.CreateEntry(FileName + "_F" + SubFileName, System.IO.Compression.CompressionLevel.Fastest);
                using (var zipStream = zipEntry.Open())
                {
                    zipStream.Write(toBytes, 0, toBytes.Length);
                }
            }
            catch (Exception)
            {
                throw;
            }
        });
    }//end using (var archive = new System.IO.Compression.ZipArchive(ms, ZipArchiveMode.Create, true))
    return File(ms.ToArray(), "application/zip", "Files.zip");
}
我问故我在的主页 我问故我在 | 初学一级 | 园豆:29
提问于:2020-08-18 20:33
< >
分享
最佳答案
1

如果是50G的文件,你这样写,再多内存都不够用。

比如Http请求为什么传文件要单单用FileStream,而不是和POST一样,了解一下,再改善自己的写法。

收获园豆:10
花飘水流兮 | 专家六级 |园豆:13595 | 2020-08-19 16:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册