我正在从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-80KBs。我想知道为什么应对内存流需要太多时间?
我的另一个问题是,何时在任何http请求中进行实际下载?当我获得响应对象或从响应对象复制流时?
我实际上是从AWS S3下载一个zip文件,并使用MemoryStream这样解压缩文件-
var zipStream = new ZipInputStream(memoryStream);
我的zip大小约为2MB。那么哪个操作会更快?将zip保存到文件系统中,然后直接从MemoryStream提取还是提取?
我的连接速度约为70-80KBs。我想知道为什么应对内存流需要太多时间?
这个问题很难回答。如果您要下载的文件太大,则将其复制到内存中会产生一些垃圾回收,这当然会带来相应的开销。显然,将文件流传输到Stream
诸如aFileStream
或a NetworkStream
(取决于您要达到的目标和特定要求)之类的其他文件可能会提高性能,甚至允许您一次从Amazon下载多个文件而不会占用所有可用RAM并迫使操作系统将废话交换出磁盘上。
我的另一个问题是,何时在任何http请求中进行实际下载?当我获得响应对象或从响应对象复制流时?
当您await
在CopyToAsync
方法调用上。该CopyToAsync
方法将小字节块从源流复制到目标流,直到到达源流的末尾。但是由于目的地Stream
是a,所以MemoryStream
您当然会失去分块复制的所有好处,因为最终会将整个文件加载到进程操作内存中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句