gpt4 book ai didi

c# - 当 Http 请求实际下载时

转载 作者:行者123 更新时间:2023-11-30 23:28:52 26 4
gpt4 key购买 nike

我正在从 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?

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

关于c# - 当 Http 请求实际下载时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35798030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com