You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7应用中RestSharp DownloadData抛出内存不足异常求助

解决方案与排查思路

问题本质

从调用栈可以看出,DownloadData会将整个文件加载到内存中的MemoryStream,虽然文件仅26MB,但MemoryStream的扩容机制(每次容量翻倍)、32位进程的内存限制,或是内存碎片化,都可能导致即使系统有1GB可用内存,仍抛出OutOfMemoryException。

排查方向

  • 检查进程位数:确认项目编译目标是64位还是32位。32位进程的内存地址空间有限(通常最大不超过2GB),哪怕系统内存充足,也可能因无法分配连续内存块触发异常。可在项目属性的「生成」选项中查看目标平台。
  • 排查内存碎片化:用Visual Studio诊断工具抓取异常前后的内存快照,检查是否存在大量碎片化内存块,导致无法满足MemoryStream的连续内存分配需求。
  • 验证RestSharp版本:确保使用最新稳定版RestSharp,旧版本可能存在内存分配相关的已知bug,升级即可修复。

可行解决方案

1. 流式下载(优先推荐)

避免一次性加载整个文件到内存,直接将响应流写入本地文件,内存占用极低:

using var client = new RestClient(BaseUrlApi, c => c.MaxTimeout = 60 * 1000);
var request = new RestRequest(path);

// 异步写法
using var responseStream = await client.ExecuteStreamAsync(request);
using var fileStream = new FileStream("目标文件路径", FileMode.Create, FileAccess.Write);
await responseStream.CopyToAsync(fileStream);

// 同步写法
using var syncResponseStream = client.ExecuteStream(request);
using var syncFileStream = new FileStream("目标文件路径", FileMode.Create, FileAccess.Write);
syncResponseStream.CopyTo(syncFileStream);

2. 预分配MemoryStream容量

如果必须获取字节数组,可先通过HEAD请求获取文件大小,提前初始化MemoryStream的容量,避免频繁扩容导致的内存碎片:

using var client = new RestClient(BaseUrlApi, c => c.MaxTimeout = 60 * 1000);

// 先发送HEAD请求获取文件长度
var headRequest = new RestRequest(path).AddHeader("Method", "HEAD");
var headResponse = client.Execute(headRequest);

if (int.TryParse(headResponse.Headers.FirstOrDefault(h => h.Name == "Content-Length")?.Value.ToString(), out int contentLength))
{
    var request = new RestRequest(path);
    using var ms = new MemoryStream(contentLength);
    using var responseStream = client.ExecuteStream(request);
    
    responseStream.CopyTo(ms);
    var fileBytes = ms.ToArray(); // 此时已得到文件字节数组
}

3. 启用大地址感知(仅32位进程)

若无法切换到64位,可在32位项目中启用大地址感知,让进程最多使用3GB内存(Windows环境)。编辑项目的.csproj文件,添加以下配置:

<PropertyGroup>
  <LargeAddressAware>true</LargeAddressAware>
</PropertyGroup>

内容的提问来源于stack exchange,提问作者Dev Mktb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:10:17