【问题标题】:When the actual download occurs for a Http Request当 Http 请求发生实际下载时
【发布时间】:2016-03-04 14:03:42
【问题描述】:

我正在从 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 请求中?当我获取响应对象或从响应对象复制 Stream 时?

编辑

我实际上是从 AWS S3 下载一个 zip 文件并使用 MemoryStream 像这样解压缩文件-

var zipStream = new ZipInputStream(memoryStream);

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

【问题讨论】:

    标签: c# .net amazon-s3 http-request


    【解决方案1】:

    我的连接速度约为 70-80KBs。我想知道为什么要应对 内存流占用太多时间?

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

    我的另一个问题是实际下载何时发生在任何 http 要求?当我得到响应对象或当我从 响应对象?

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

    【讨论】:

    • 我的文件大小约为 2MB。 “CopyToAsync() 方法将复制小字节块”。我想知道这个字节块是从哪里来的。来自我的响应对象,还是来自服务器?
    • 由于 Amazon 客户端正在进行 HTTP 调用,因此您的源流是 NetworkStream。在 .NET 中,NetworkStream 只是一个指向底层 Socket 数据的指针。所以你基本上是从这个套接字复制字节块到你的进程内存中(MemoryStream)。如果您对这些块的确切大小感兴趣,您可以查阅您正在使用的 CopyToAsync 方法的文档,其中清楚地指出该块大小为 81920 字节。
    • 请参阅我的问题的编辑部分并帮助我。
    • 将下载的文件保存到文件系统(FileStream),然后从那里解压。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多