【问题标题】:Amazon S3 .NET SDK can upload only by 2 streamsAmazon S3 .NET SDK 只能通过 2 个流上传
【发布时间】:2014-04-17 18:07:59
【问题描述】:

一段时间以来,我一直在尝试提高从我的 c# 应用程序到 S3 服务器的上传速度,但我得到的最大值是 2 个同时流,每个流高达 100 KB/s。如果令人沮丧,考虑到在浏览器中您最多可以上传 1.0 MB/s。这是我的上传代码,它使用 UploadPartRequest,在单独的线程中调用。尽管如此,S3 只允许同时上传 2 个线程:

List<UploadPartResponse> uploadResponses = new List<UploadPartResponse>();
        List<Thread> uploadThreads = new List<Thread>();

        InitiateMultipartUploadRequest initiateRequest = new InitiateMultipartUploadRequest
        {
            BucketName = BucketName,
            Key = result
        };

        InitiateMultipartUploadResponse initResponse = _S3client.InitiateMultipartUpload(initiateRequest);
        _curContentLength = new FileInfo(pathToResult + result).Length;
        long partSize = 5 * (long)Math.Pow(2, 20); // 5 MB

          long filePosition = 0;
          for (int i = 1; filePosition < _curContentLength; i++)
          {
              if ( filePosition + partSize > _curContentLength )
              {
                  partSize = _curContentLength - filePosition;
              }
              UploadPartRequest uploadRequest = new UploadPartRequest
                  {
                      BucketName = BucketName,
                      UploadId = initResponse.UploadId,
                      PartNumber = i,
                      PartSize = partSize,
                      FilePosition = filePosition,
                      Key = result,
                FilePath = (pathToResult + result)
                  };

                  uploadRequest.StreamTransferProgress += uploadFileProgressCallback;

                  // Upload part and add response to our list.

                  Thread t = new Thread(() => uploadResponses.Add(_S3client.UploadPart(uploadRequest)));
                  t.Start();
                  uploadThreads.Add(t);
                  filePosition += partSize;
              }

              foreach (var uploadThread in uploadThreads)
              {
                  uploadThread.Join();
              }

              // Step 3: complete.
              CompleteMultipartUploadRequest completeRequest = new CompleteMultipartUploadRequest
                  {
                      BucketName = BucketName,
                      UploadId = initResponse.UploadId,
                      Key = result
                      //,PartETags = new List<PartETag>(uploadResponses)

                  };
              completeRequest.AddPartETags(uploadResponses);
              _S3client.CompleteMultipartUpload(completeRequest);
              _systemEnable = true;
              WriteLineToLog("Успешно залил ролик на S3!", intId);
              break;
          }

代码有问题还是无法以大于 200 KB/s 的速度使用 c# 上传到 s3?谢谢!

【问题讨论】:

    标签: c# amazon-web-services upload amazon-s3 multipart


    【解决方案1】:

    我认为这个问题不是来自 Amazon S3,它只是因为“HTTP Two-Connection Limit”。

    您可以通过将此配置添加到您的 app.config 文件中来更改它:

    <configuration>  
      <system.net>
        <connectionManagement>
           <add address="*" maxconnection="20" />
        </connectionManagement>
      </system.net>
    </configuration>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      相关资源
      最近更新 更多