2014-11-04 62 views
1

使用TransportUtility类将文件上传到S3时,可以选择使用FilePath或输入流。我正在使用多部分上传。Amazon S3传递使用FilePath或Stream?

我正在上传各种东西,其中一些是磁盘上的文件,另一些是原始流。我目前正在使用InputStream这个品种,但是我想知道是否应该进一步改进这个方法。对于磁盘上的文件,我基本上使用File.OpenRead并将该流传递给传输请求的InputStream

是否有任何性能增益或其他方式优于FilePath方法而不是InputStream方法,其中输入被称为文件。

简而言之:这是同样的事情

using (var fs = File.OpenRead("some path")) 
{ 
    var uploadMultipartRequest = new TransferUtilityUploadRequest 
    { 
     BucketName = "defaultBucket", 
     Key = "key", 
     InputStream = fs, 
     PartSize = partSize 
    }; 

    using (var transferUtility = new TransferUtility(s3Client)) 
    { 
     await transferUtility.UploadAsync(uploadMultipartRequest); 
    } 
} 

由于:

var uploadMultipartRequest = new TransferUtilityUploadRequest 
    { 
     BucketName = "defaultBucket", 
     Key = "key", 
     FilePath = "some path", 
     PartSize = partSize 
    }; 

    using (var transferUtility = new TransferUtility(s3Client)) 
    { 
     await transferUtility.UploadAsync(uploadMultipartRequest); 
    } 

抑或是两者之间有任何显著区别?我知道文件是否很大,并且可以基于此选择一种或另一种方法。

编辑:我也做了S3Client的一些反编译,并有确实似乎是关于转移的并发级别差一些,在MultipartUploadCommand.cs

private int CalculateConcurrentServiceRequests() 
{ 
    int num = !this._fileTransporterRequest.IsSetFilePath() || this._s3Client is AmazonS3EncryptionClient ? 1 : this._config.ConcurrentServiceRequests; 
    if (this._totalNumberOfParts < num) 
    num = this._totalNumberOfParts; 
    return num; 
} 
+0

即使其中一个比另一个慢100倍,它与光盘的IO速度相比并不重要,但它选择的代码行数少于其他代码的版本,因此可以更快地理解和维护它程序员。 – 2014-11-04 14:26:01

回答

1

发现自所述TransferUtility documentation

当通过指定的文件路径,而不是一个 流的上载大文件,TransferUtility使用多个线程上载多个部件一次上传个。在处理大容量内容和高带宽时,这可以显着提高吞吐量。

这说明使用文件路径将使用MultiPart上传,但使用流将不会。

但是当我通过这个Upload Method (stream, bucketName, key)阅读:

上传指定的流内容。对于大型上传, 文件将使用Amazon S3的多部分 API进行分割和上传。这些部件将在Amazon S3中重新组装为一个对象。

这意味着MultiPart也在Streams上使用。
亚马逊推荐使用多如果上传文件的大小是大于100MB http://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html

多部分上传允许你上传单个对象为一组 部分。每个部分都是对象数据的连续部分。您可以按照任意顺序独立上传这些对象部件。如果 传输的任何部分失败,您可以重新传输该部分,而不影响其他部分 。在上传对象的所有部分后, Amazon S3会组装这些部件并创建对象。一般来说,当您的对象大小达到100 MB时,您应该考虑使用 分段上传,而不是在单个 操作中上传对象。

使用多上传具有以下优点:

提高吞吐量,您可以同时上传部分改善 吞吐量。从任何网络问题快速恢复 - 更小的部件尺寸 可以最大限度地减少由于网络错误导致的重新启动失败的上载的影响。暂停和恢复对象上传 - 您可以随时间上传对象部件 。一旦你开始分段上传,就没有过期; 您必须明确地完成或中止分段上传。在您知道最终对象大小之前开始上传 - 您可以在创建对象时上传对象 。

因此,基于Amazon S3,在使用Stream或File Path之间没有区别,但它可能会使您的代码和操作系统的性能略有差异。