作者:mobiledu2502886053 | 来源:互联网 | 2022-11-28 04:53
所以我正在开发一个每天运行一次的Windows服务.该服务用于将数据从外部数据库合并到我的数据库.问题是我只能使用存储过程访问外部数据库.
当我使用其中一个存储过程时,它返回120万个对象,我的服务的ram使用率上升到2.5GB.
仅供参考:我首先使用EF 6和DB作为外部数据库,然后首先使用我的数据库代码.
以下方法中的GetArt()是实体框架创建的存储过程之一,它返回120万个对象.
public List GetArtls()
{
List results = new List();
using (ExternalContext cOntext= new ExternalContext()) {
results = context.GetArt().ToList();
}
return results;
}
public void SaveArticles(List externalArtls)
{
try {
List artls = new List();
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万个对象?
1> Marc Gravell..:
在这种情况下,您最好的选择可能是尝试使用非缓冲读取器API,这样您就不需要一次缓冲内存中的所有对象.我不知道什么context.GetArt()
返回,但如果已经 返回,IEnumerable
那么你可能已经有了这个权限; 然后,您可以遍历该数据(foreach
)以执行您需要的任何操作,而无需一次将所有数据都存储在内存中.如果GetArt()
方法没有提供:那么可以使用替代API.例如,使用"dapper",这可以Query
指定可选buffered: false
参数(默认为true
,因为这适用于大多数用例).
但请注意,这里的关键点是:你不能将它们扔进去List
.你这样做的那一刻 - 它需要缓冲.同样,像OrderBy
(当应用于序列而不是查询时)的操作:导致缓冲.