请教一下各位先进:
我需要将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");
}
如果是50G的文件,你这样写,再多内存都不够用。
比如Http请求为什么传文件要单单用FileStream,而不是和POST一样,了解一下,再改善自己的写法。