当Http请求发生实际下载时

时间:2016-03-04 14:03:43

标签: c# .net amazon-s3 http-request

我正在从Amazon S3下载zip文件。然后我将此zip转换为MemoryStream。我的代码在

之下
AmazonS3Client s3Client = new AmazonS3Client(basicAwsCredentials, Amazon.RegionEndpoint.GetBySystemName(item.RegionEndPoint));
//This operation needs about 3-4s
response = await s3Client.GetObjectAsync(request);

var memoryStream = new MemoryStream();
//This operation needs about 8-9s
await response.ResponseStream.CopyToAsync(memoryStream);
memoryStream.Position = 0;

我的连接速度约为70-80KB。我想知道为什么应对内存流需要花费太多时间?

我的另一个问题是在任何http请求中发生实际下载的时间?当我得到响应对象或从响应对象复制流时?

修改

我实际上是从AWS S3下载zip文件并使用MemoryStream解压缩文件 -

var zipStream = new ZipInputStream(memoryStream);

我的拉链尺寸约为2MB。那么哪个操作会更快?将zip保存到文件系统中,然后直接从MemoryStream中提取或提取?

1 个答案:

答案 0 :(得分:2)

  

我的连接速度约为70-80KB。我想知道为什么要应对   内存流需要太多时间?

很难回答这个问题。如果您下载的文件太大,将其复制到内存中会产生一些垃圾收集,当然会带来相应的开销。显然,将文件流式传输到其他Stream,例如FileStreamNetworkStream(取决于您要实现的目标和具体要求)可能会提高性能甚至允许您从亚马逊一次下载多个文件,而不会破坏所有可用内存,并强制操作系统将磁盘上的垃圾交换掉。

  

我的另一个问题是当实际下载发生在任何http中   请求?当我得到响应对象或从我复制流时   回应对象?

await方法调用时CopyToAsyncCopyToAsync方法将小字节块从源流复制到目标流,直到它到达源流的末尾。但是,由于您的目的地StreamMemoryStream,您当然会失去这种分块复制的所有好处,因为您最终会将整个文件加载到您的过程操作内存中。