繁体   English   中英

并行分块与顺序分块文件上传

[英]Parallel Chunked vs Sequential Chunked file upload

我试图找出将大文件上传到服务器的最佳方式。 在本地,我尝试了两种方法:

  1. 顺序分块上传,其中文件被分解为多个块并一次上传一个到服务器。 在服务器端,传入的块直接附加到最终文件中。
  2. 并行分块上传,其中分块并行上传到服务器。 服务器将文件存储为临时小文件,然后在所有块上传后将它们合并为一个完整文件。

但是这里的合并时间比上传时间要长得多,至少在我的本地是这样。 因此,并行上传总是比顺序上传慢很多。 如何缩短上传时间?

这是顺序上传代码:

    [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();
    }

对于大文件,首选并行上传。 但有几件事需要考虑

  1. 将文件分成许多小文件时,请确保不要一次上传所有文件。 确保最多有大约 50 个并行上传。 当然,数量可能会有所不同,但可以肯定的是,如果您尝试一次上传 10000 个文件,它将无法正常工作。 使用某种活动上传队列。
  2. 确保服务器支持他们这边的并行下载。

并行取胜,但如果你想开发这样的系统,你必须做额外的工作。

  1. 您不应为每个域 (FQDN) 创建超过 6 个连接,因为客户端存在连接限制。 您可以通过使用相同的 ip 但不同的域名(如upload1.domain.comupload2.domain.com等)来增加限制。但是你可能会填满带宽。

  2. 您不应在每次收到零件时打开和关闭文件,这是一项非常昂贵的操作。 而是创建一个打开文件的编写器类,并将接收到的部分和要写入的位置排队,编写器将在可能时写入,并在写入所有部分时关闭文件。 你会用内存来交换磁盘延迟。

  3. 如果可以启用TCP快速启动。 这将使您可以更快地将数据发送到您的服务器

  4. 明智地选择缓冲区大小。 在需要最少磁盘 IO 甚至更少网络 IO 的情况下尝试使用不同的大小。 缓冲区大小必须是磁盘扇区大小的倍数。

这些是我从以前的经历中想到的。 我不记得确切的细节,但这些项目应该会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM