HttpClient 内存使用量激增且响应较大

2023-11-25

我正在开发一个控制台应用程序,它获取视频数据的端点列表,发出 HTTP 请求,并将结果保存到文件中。这些是相对较小的视频。由于我无法控制的问题,其中一个视频是very大(145 分钟而不是几秒)。

我看到的问题是,在调用该请求后,我的内存使用量激增至约 1 GB,并且最终收到“任务已取消”错误(可能是因为客户端超时)。这很好,我不想要这个视频,但令人担忧的是,无论我做什么,我分配的内存仍然很高。我希望能够释放内存。任务管理器在这次调用之前显示 ~14 MB 内存使用量,然后不断增加,这似乎令人担忧。在 VS 调试器中我只看到一个尖峰。

我尝试把所有东西都扔进using声明,重新初始化HttpClient出现异常时,手动调用GC.Collect()没有运气。我正在使用的代码看起来像这样:

consumer.Received += async (model, ea) =>
{
    InitializeHttpClient(source);
    ...
    foreach(var item in queue)
    {
        await SaveFileFromEndpoint(url, fileName);
        ...
    }
}

和方法:

public void InitializeHttpClient(string source)
{
    ...
    _client = new HttpClient();
    ...
}

public async Task SaveFileFromEndpoint(string endpoint, string fileName)
{
    try
    {
        using (HttpResponseMessage response = await _client.GetAsync(endpoint))
        {
            if (response.IsSuccessStatusCode)
            {
                using(var content = await response.Content.ReadAsStreamAsync())
                using (var fileStream = File.Create($"{fileName}"))
                {
                    await response.Content.CopyToAsync(fileStream);
                }
            }
        }
    }
    catch (Exception ex)
    {

    }
}

这是我的调试器输出:

memory spike

我想我对所看到的有几个问题:

  1. 我看到的内存使用情况实际上是一个问题吗?
  2. 有什么方法可以释放大型 HTTP 请求分配的内存吗?
  3. 有什么方法可以在进行调用和分配内存之前查看请求的内容长度吗?到目前为止,我还没有找到一种方法可以在分配实际内存之前找出情况。

在此先感谢您的帮助!


如果你使用HttpClient.SendAsync(HttpRequestMessage, HttpCompletionOption)代替GetAsync,你可以提供HttpCompletionOption.ResponseHeadersRead,(与默认的ResponseContentRead)。这意味着响应流将在响应正文下载之前(而不是下载之后)交还给您,并且操作所需的缓冲区将显着减少。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpClient 内存使用量激增且响应较大 的相关文章

  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 为什么大多数 C 开发人员使用 Define 而不是 const? [复制]

    这个问题在这里已经有答案了 在许多程序中 define与常量具有相同的用途 例如 define FIELD WIDTH 10 const int fieldWidth 10 我通常认为第一种形式优于另一种形式 它依赖于预处理器来处理基本上是
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 将构建日期放入“关于”框中

    我有一个带有 关于 框的 C WinForms 应用程序 我使用以下方法将版本号放入 关于 框中 FileVersionInfo GetVersionInfo Assembly GetExecutingAssembly Location F
  • 在 C 中使用 GNU automake 中的解析器

    我是 GNU autotools 的新手 在我的项目中使用了 lex 和 yacc 解析器 将它们作为 makefile am 中的源代码会产生以下错误 配置 in AC CHECK PROGS YACC bison yacc none i
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 当存在打开的 ASP.NET 4.5 Websocket 时,IIS 应用程序池无法回收

    我遇到了一个问题 可以通过以下方式复制 您需要 IIS8 因此必须在 Windows 8 或 Windows Server 2012 R2 上 在 IIS 管理器中创建一个新网站 例如在端口 8881 上的 TestWs 指向一个新文件夹
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • Javascript Highcharts v3.0.5 - 使用多个 Y 轴时如何隐藏 Y 轴标题

    使用 Highcharts v 3 0 5 时 我在同一个图表中显示多个 Y 轴 使用图例 用户可以根据需要选择隐藏或显示任何 Y 轴 所有这些都是 Highcharts javascript 库的内置功能 但是 当 Y 轴隐藏时 其标题在
  • Angular / Gulp 应用程序的模拟后端

    我想通过提供 json 响应来模拟后端 以便更快地开发 而不依赖于真正的后端 前端应用程序是一个 Angular 应用程序 我们使用 Gulp 作为开发和构建工具 例如 有一个特定的 api custumers 123 返回静态 json
  • 如何在组件之间共享数据/更改

    假设您有一个包含工具栏 侧边栏和网格的界面 工具栏有一个下拉菜单 当用户更改时 侧边栏和网格中的内容也会更改 回到 Angular 1 我会使用服务来获取所有动态数据 当服务发生变化时 使用该服务的所有组件也会更新 在 Angular 2
  • Android中访问资源文件

    我的 res raw 文件夹 res raw textfile txt 中有一个资源文件 我试图从我的 Android 应用程序中读取该资源文件进行处理 public static void main String args File fi
  • 奇怪的 SQLException:未找到列

    我在使用 JDBC 对数据库运行的函数上遇到了奇怪的 SQLException SQLException 未找到列 消息 我的函数中有这个 st con prepareStatement SELECT NotificationID User
  • numpy 平均值错误?

    我通常会进行大型模拟工作 有时 我需要计算粒子组的质心 我注意到在很多情况下 返回的平均值numpy mean 是错的 我可以看出这是由于累加器饱和造成的 为了避免这个问题 我可以将所有粒子的求和分解为一小组粒子 但这很不舒服 有人知道如何
  • 如何获取覆盖 hashCode() 的对象的唯一 ID?

    当Java中的类不重写时哈希码 打印此类的实例会给出一个很好的唯一编号 对象的 Javadoc 说哈希码 在相当实用的情况下 Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数 但是当类覆盖时哈希码 我怎样才能得到
  • 实体类上是否等于和hashcode,这就是问题

    我一直在尝试推理处理在实体上实现 hashcode 和 equals 是否通常是良好实践的最佳方法 我指的是一般意义上的实体 但在大多数情况下它将是 JPA 实体 在 Hibernate 手册第 24 章中http docs jboss o
  • 使用 PHP 将 IP 解析为主机名

    如何使用 PHP 将 IP 地址解析为主机名 您可以使用获取主机地址 功能 hostname gethostbyaddr ipAddress
  • Azure DevOps API 添加公钥

    我希望能够通过 API 添加用于 SSH 访问 Azure DevOps 的公钥 但我似乎无法在 doco 中找到实现此操作的方法 通过 UI 手动执行此操作是不可行的 因为这适用于许多用户和许多项目 谢谢 API 没有记录 但是我们可以使
  • 如果 Dto 使用 MapStruct 有 Id,则将 dto 映射到从数据库检索的实体

    我在用着映射结构使dto lt gt entity映射 相同的映射器用于create and update来自 dtos 的实体 对 dto 的 id 进行验证 以了解是否必须创建新实体 id null 还是应从数据库检索新实体 id nu
  • 为什么 Express(或其他集成)与 Apollo GraphQL Server 结合使用?

    我正在努力理解 Express 或 Koa Hapi 等 与 Apollo GraphQL 服务器集成的附加值 我发现它可以在独立模式下很好地工作 例如 https medium com codingthesmartway com blog
  • 具有不同高度列的 Bootstrap 行

    我目前有类似的东西 div class row div class col md 4 Content div div class col md 4 Content div div class col md 4 Content div div
  • 如何获取具有不同结构和不同字段的 JSON 格式的 FastAPI 应用程序控制台日志?

    我有一个 FastAPI 应用程序 我希望将默认日志写入 STDOUT 并使用 JSON 格式的以下数据 应用程序日志应如下所示 XYZ log level info type app timestamp 2022 01 16T08 30
  • 其他 RDBMS 上是否有与 Postgresql EVERY 聚合函数等效的函数?

    每个聚合的文档 每个 表达式 如果所有输入值均为 true 则为 true 否则为 false http www postgresql org docs 9 1 static functions aggregate html EVERY 在
  • 如何在Windows 7 Aero任务预览中创建自己的控件?

    我有两个关于 Windows 7 任务预览的问题 在 Delphi 中 我想在下面屏幕截图中突出显示的区域内创建自己的按钮 1 Is it possible to create my own controls in the task pre
  • 替换文件中的行 C++

    我正在尝试找到一种方法来用新行替换文件中包含字符串的行 如果文件中不存在该字符串 则将其附加到文件中 有人可以给出示例代码吗 编辑 如果我需要替换的行位于文件末尾 是否还有 尽管我认识到这不是最明智的方法 但以下代码显示demo txt逐行
  • 角度5:如何等待我的服务完成然后继续下一个任务?

    我的 angular5 应用程序中有一个组件 名为 product list component ts 在此组件中 我有一个构造函数 它调用 REST API 产品 服务 ts getAllProductsFromACategory cat
  • Kivy:未知类 错误代码

    这是main py from kivy app import App class WeatherApp App pass if name main WeatherApp run 天气 kv 是 AddLocationForm
  • HttpClient 内存使用量激增且响应较大

    我正在开发一个控制台应用程序 它获取视频数据的端点列表 发出 HTTP 请求 并将结果保存到文件中 这些是相对较小的视频 由于我无法控制的问题 其中一个视频是very大 145 分钟而不是几秒 我看到的问题是 在调用该请求后 我的内存使用量