【发布时间】: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