gpt4 book ai didi

c# - 处理大的存储过程结果

转载 作者:行者123 更新时间:2023-11-30 14:45:27 24 4
gpt4 key购买 nike

我正在开发一项每天运行一次的 Windows 服务。该服务用于将数据从外部数据库合并到我的数据库。问题是我只能使用存储过程访问外部数据库。

当我使用其中一个存储过程时,它返回 120 万个对象,我的服务的 RAM 使用量上升到 2.5GB。

仅供引用:我首先将 EF 6 与 DB 一起用于外部数据库,然后首先为我的数据库编写代码。

以下方法中的 GetArt() 是 Entity Framework 创建的存储过程之一,它返回 120 万个对象。

public List<GetArt_Result> GetArtls()
{
List<GetArt_Result> results = new List<GetArt_Result>();
using (ExternalContext context = new ExternalContext()) {
results = context.GetArt().ToList();
}

return results;
}

public void SaveArticles(List<GetArt_Result> externalArtls)
{
try {
List<Article> artls = new List<Article>();
foreach (var artl in externalArtls) {
artls.Add(new Article(artl));
}
using (DbContext context = new DbContext()) {
context.BulkInsert(artls);
}
} catch (Exception ex) {
throw ex;
}
}

如何在不使用高 RAM 的情况下处理 120 万个对象?

最佳答案

在这种情况下,最好的办法可能是尝试使用非缓冲读取器 API,这样您就不需要一次缓冲内存中的所有对象。我不知道是什么context.GetArt()返回,但如果这是已经 IEnumerable<T> ,那么可能您已经可以访问它;然后您可以遍历该数据 ( foreach ) 以执行您需要的任何操作,而不必一次将所有数据都存储在内存中。如果GetArt()方法提供这个:那么它可能会使用一个替代的 API。例如,对于“dapper”,这可能是 Query<T>指定可选的 buffered: false参数(默认为 true ,因为这适用于大多数用例)。

但是请注意,这里的关键点是:你不能将它们扔进 List<T> 中。 .你这样做的那一刻 - 它需要缓冲。同样,类似 OrderBy 的操作(应用于序列而非查询时):导致缓冲。

关于c# - 处理大的存储过程结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53521379/

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