我正在从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中提取或提取?
答案 0 :(得分:2)
我的连接速度约为70-80KB。我想知道为什么要应对 内存流需要太多时间?
很难回答这个问题。如果您下载的文件太大,将其复制到内存中会产生一些垃圾收集,当然会带来相应的开销。显然,将文件流式传输到其他Stream
,例如FileStream
或NetworkStream
(取决于您要实现的目标和具体要求)可能会提高性能甚至允许您从亚马逊一次下载多个文件,而不会破坏所有可用内存,并强制操作系统将磁盘上的垃圾交换掉。
我的另一个问题是当实际下载发生在任何http中 请求?当我得到响应对象或从我复制流时 回应对象?
await
方法调用时CopyToAsync
。 CopyToAsync
方法将小字节块从源流复制到目标流,直到它到达源流的末尾。但是,由于您的目的地Stream
是MemoryStream
,您当然会失去这种分块复制的所有好处,因为您最终会将整个文件加载到您的过程操作内存中。