当 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
,例如 FileStream
或 NetworkStream
(具体取决于您要实现的目标和您的具体要求)可能会提高性能,甚至允许您一次从 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?
当你await
对CopyToAsync
方法调用时。 CopyToAsync
方法会将小字节块从源流复制到目标流,直到它到达源流的末尾。但是因为你的目的地 Stream
是一个 MemoryStream
你当然会失去这种分块复制的所有好处,因为你最终将整个文件加载到你的进程操作内存中。
我正在从 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
,例如 FileStream
或 NetworkStream
(具体取决于您要实现的目标和您的具体要求)可能会提高性能,甚至允许您一次从 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?
当你await
对CopyToAsync
方法调用时。 CopyToAsync
方法会将小字节块从源流复制到目标流,直到它到达源流的末尾。但是因为你的目的地 Stream
是一个 MemoryStream
你当然会失去这种分块复制的所有好处,因为你最终将整个文件加载到你的进程操作内存中。