C# 处理大型存储过程reults
所以我正在开发一个每天运行一次的windows服务。该服务用于将外部数据库中的数据合并到我的数据库中。问题是我只能通过存储过程访问外部数据库 当我使用其中一个存储过程时,它返回120万个对象,而我的服务的ram使用量上升到2.5GB 仅供参考:我正在使用EF 6,外部数据库先使用DB,数据库先使用代码 下面方法中的GetArt()是实体框架创建的存储过程之一,它返回120万个对象C# 处理大型存储过程reults,c#,entity-framework,C#,Entity Framework,所以我正在开发一个每天运行一次的windows服务。该服务用于将外部数据库中的数据合并到我的数据库中。问题是我只能通过存储过程访问外部数据库 当我使用其中一个存储过程时,它返回120万个对象,而我的服务的ram使用量上升到2.5GB 仅供参考:我正在使用EF 6,外部数据库先使用DB,数据库先使用代码 下面方法中的GetArt()是实体框架创建的存储过程之一,它返回120万个对象 public List<GetArt_Result> GetArtls() {
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;
}
}
公共列表GetArtls()
{
列表结果=新列表();
使用(ExternalContext=new ExternalContext()){
结果=context.GetArt().ToList();
}
返回结果;
}
公共作废保存项目(列出外部项目)
{
试一试{
List artls=新列表();
foreach(外部艺术中的var artl){
添加(新条款(artl));
}
使用(DbContext context=new DbContext()){
上下文插入(artls);
}
}捕获(例外情况除外){
掷骰子;
}
}
我的问题:如何在没有高ram使用率的情况下处理120万个对象?在这种情况下,您最好尝试使用非缓冲读取器API,这样您就不需要一次缓冲内存中的所有对象。我不知道
context.GetArt()
返回什么,但是如果这已经是IEnumerable
,那么您可能已经可以访问它了;然后,您可以迭代该数据(foreach
),以执行您需要执行的任何操作,而不必一次将所有数据存储在内存中。如果GetArt()。例如,使用“dapper”,这可以是Query
指定可选的buffered:false
参数(它默认为true
,因为这对于大多数用例来说都很好)
但是,请注意,这里的关键点是:您不能将它们放入列表中。当你这样做的时候,它需要缓冲。类似地,类似于OrderBy
(应用于序列而非查询时)的操作会导致缓冲。或者,您可以研究纯数据库解决方案,例如从windows服务在数据库上运行过程,这些SP将在外部数据库上调用过程