[英]Parallel Chunked vs Sequential Chunked file upload
我试图找出将大文件上传到服务器的最佳方式。 在本地,我尝试了两种方法:
但是这里的合并时间比上传时间要长得多,至少在我的本地是这样。 因此,并行上传总是比顺序上传慢很多。 如何缩短上传时间?
这是顺序上传代码:
[HttpPost]
[RequestFormLimits(MultipartBodyLengthLimit = 209715200)]
[RequestSizeLimit(209715200)]
public async Task<IActionResult> UploadSeq()
{
string filename = "./Uploads/seqfile";
using(Stream file = Request.Body)
using (FileStream stream = new FileStream(filename, FileMode.Append))
{
await file.CopyToAsync(stream);
await stream.FlushAsync();
}
return Ok();
}
这是并行代码:
[HttpPost("/ParUpload/{id}/{size}")]
[RequestFormLimits(MultipartBodyLengthLimit = 209715200)]
[RequestSizeLimit(209715200)]
public async Task<IActionResult> UploadParallel(int id, int size)
{
string filename = "./Uploads/parfilecomplete.mkv";
using (Stream file = Request.Body)
using (FileStream stream = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
{
stream.Seek(id * size, SeekOrigin.Begin);
await file.CopyToAsync(stream);
await stream.FlushAsync();
}
return Ok();
}
对于大文件,首选并行上传。 但有几件事需要考虑
并行取胜,但如果你想开发这样的系统,你必须做额外的工作。
您不应为每个域 (FQDN) 创建超过 6 个连接,因为客户端存在连接限制。 您可以通过使用相同的 ip 但不同的域名(如upload1.domain.com
、 upload2.domain.com
等)来增加限制。但是你可能会填满带宽。
您不应在每次收到零件时打开和关闭文件,这是一项非常昂贵的操作。 而是创建一个打开文件的编写器类,并将接收到的部分和要写入的位置排队,编写器将在可能时写入,并在写入所有部分时关闭文件。 你会用内存来交换磁盘延迟。
如果可以启用TCP快速启动。 这将使您可以更快地将数据发送到您的服务器
明智地选择缓冲区大小。 在需要最少磁盘 IO 甚至更少网络 IO 的情况下尝试使用不同的大小。 缓冲区大小必须是磁盘扇区大小的倍数。
这些是我从以前的经历中想到的。 我不记得确切的细节,但这些项目应该会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.