当 Http 请求实际下载时

When the actual download occurs for a 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);

我的 zip 大小约为 2MB。那么哪个操作会更快呢?将zip保存到文件系统中,然后解压或直接从MemoryStream中解压?

My connection speed about 70-80KBs. I want to know why coping to memory stream takes too much time?

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

My another question is when the actual download occurs in any http request? when I get the response object or when I copy the Stream from response object?

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