我注意到之前没有问过这个问题所以我想问这个问题......
目前正在编写一个上传控制器来上传一些相当大的文件。但我注意到当它上传大文件时,CPU和RAM达到峰值,这真的不是我想要的(当然你也是)
我的控制器看起来像:
int Count = 0;
string _uploadsFolder = HostingEnvironment.MapPath("~/Upload/Files/Images/");
for (int i = 0; i < Request.Files.Count; i++)
{
HttpPostedFileBase _file = Request.Files[i];
// Validation ......
FileMIME mimetype = new FileMIME();
mimetype.AllowedMimeTypes.Add("image/png");
mimetype.AllowedMimeTypes.Add("image/jpeg");
mimetype.AllowedMimeTypes.Add("image/gif");
if ((_file.ContentLength > 0) && (_file.ContentLength < 4194304) && (mimetype.IsImage(_file)))
{
string guid = Guid.NewGuid().ToString();
string _fileLocation = Path.Combine(_uploadsFolder, Path.GetFileName(_file.FileName));
_file.SaveAs(_fileLocation);
Count++;
}
}
有没有把这个缓冲区变成硬盘而不是ram?
非常感谢你......答案 0 :(得分:0)
我不确定,但如果不使用CPU和RAM,它将如何进入硬盘?似乎服务器需要通过RAM处理流,以便将其写入硬盘驱动器。
答案 1 :(得分:0)
如果这是来自网页然后从客户端计算机到服务器,则需要将流加载到内存中。我认为没有办法解决这个问题。
可能有办法减轻服务器上的负载。您可以将其设置为异步,让用户可以相对自由地继续。
您可以以块的形式处理数据流,而不是一次性处理。
可能还有其他人,但所有这些仍然会使用ram。
看起来您可能正在接受图片。您可以在保存到数据库之前在内存中调整图像大小,这样一旦您拥有该文件,这将减少RAM上的任何未来负载,但是再次,这会在您上传文件时使用RAM。
(唯一的)另一种方式,也就是非常奇怪的方式,可能是允许用户将文件ftp到您的站点,然后使用表中的条目引用该文件。
您甚至可以通过您的网络应用程序执行此操作,但我从未尝试过。