C# awaited entity framework 在循环内执行内存操作的核心非常慢
C# awaited entity framework core in memory operation is very slow when performed within loop
我有这种代码,我正在尝试使用内存中的 ef 核心数据库进行单元测试。
public async Task<int> UpdateHistoricalWeatherDataAllLocationsAsync()
{
var regions = DalContext.Region.ToList();
var allInsertAmounts = new List<int>();
foreach (var region in regions)
{
var startDate = DateTime.Now.AddYears(-3);
var endDate = DateTime.Now;
while (startDate < endDate)
{
// Hit Api
HttpResponseMessage res= await HitApi(region, batchStartDate, batchEndDate);
var parsedResult = await ParseResultToStrongType(apixuResponse);
var recoredsInserted = await WriteToDb(parsedResult, region, batchStartDate, batchEndDate);
allInsertAmounts.Add(recoredsInserted);
startDate = startDate.AddDays(30);
}
}
return allInsertAmounts.Count();
}
所以我循环一些区域并 foreach 循环一些日期范围。
我点击了一个 api,解析结果,将其发送到保存它的函数。执行此代码的速度非常慢。
下面是使用方法
private async Task<HttpResponseMessage>HitApi(Region region, DateTime startDate, DateTime endDate) {
return await Client
.GetAsync(somestring);
}
private async Task<ApiResponse> ParseResultToStrongType(HttpResponseMessage httpResponse) {
var responseBody = await httpResponse.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<ApiResponse>(responseBody);
}
private async Task<int> WriteToDb(ApiResponse apiData, Region region, DateTime batchStartDate, DateTime batchEndDate) {
var batch = new List<Thing>();
foreach (var data in apiData.list) {
var thing= new Thing {
// pull the properties out
};
batch.Add(newHistoricalWeather);
}
DalContext.Thing.AddRange(batch);
DalContext.SaveChanges();
}
由于某种原因,等待 SaveChangesAsync 的速度非常慢,所以我改为非异步,这似乎已经改善了问题。但我不确定为什么开始时速度很慢...
对于 89 个地区,每个地区大约有 3 年的每月批次,每个国家平均有 5 个地区,我是 (89 * 36) = 3204 次 运行ning savechanges,这看起来并不多。每一个都涉及插入 30 条记录,总共 96,000 条记录。
是的,它在内存中,是的,它在异步方法中的循环中,在我们甚至可以进行写入之前调用并等待 2 个异步方法,但是现在仍然需要 20 多分钟才能 运行 本次测试
是不是因为是内存数据库?
到底是什么等待ef核心保存方法比同步版本慢我还是不知道。但我能够确定问题出在内存数据库中。我不再使用它,因为我的测试涉及大量结果集 - 我使用真实的测试数据库..
我有这种代码,我正在尝试使用内存中的 ef 核心数据库进行单元测试。
public async Task<int> UpdateHistoricalWeatherDataAllLocationsAsync()
{
var regions = DalContext.Region.ToList();
var allInsertAmounts = new List<int>();
foreach (var region in regions)
{
var startDate = DateTime.Now.AddYears(-3);
var endDate = DateTime.Now;
while (startDate < endDate)
{
// Hit Api
HttpResponseMessage res= await HitApi(region, batchStartDate, batchEndDate);
var parsedResult = await ParseResultToStrongType(apixuResponse);
var recoredsInserted = await WriteToDb(parsedResult, region, batchStartDate, batchEndDate);
allInsertAmounts.Add(recoredsInserted);
startDate = startDate.AddDays(30);
}
}
return allInsertAmounts.Count();
}
所以我循环一些区域并 foreach 循环一些日期范围。
我点击了一个 api,解析结果,将其发送到保存它的函数。执行此代码的速度非常慢。
下面是使用方法
private async Task<HttpResponseMessage>HitApi(Region region, DateTime startDate, DateTime endDate) {
return await Client
.GetAsync(somestring);
}
private async Task<ApiResponse> ParseResultToStrongType(HttpResponseMessage httpResponse) {
var responseBody = await httpResponse.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<ApiResponse>(responseBody);
}
private async Task<int> WriteToDb(ApiResponse apiData, Region region, DateTime batchStartDate, DateTime batchEndDate) {
var batch = new List<Thing>();
foreach (var data in apiData.list) {
var thing= new Thing {
// pull the properties out
};
batch.Add(newHistoricalWeather);
}
DalContext.Thing.AddRange(batch);
DalContext.SaveChanges();
}
由于某种原因,等待 SaveChangesAsync 的速度非常慢,所以我改为非异步,这似乎已经改善了问题。但我不确定为什么开始时速度很慢...
对于 89 个地区,每个地区大约有 3 年的每月批次,每个国家平均有 5 个地区,我是 (89 * 36) = 3204 次 运行ning savechanges,这看起来并不多。每一个都涉及插入 30 条记录,总共 96,000 条记录。
是的,它在内存中,是的,它在异步方法中的循环中,在我们甚至可以进行写入之前调用并等待 2 个异步方法,但是现在仍然需要 20 多分钟才能 运行 本次测试
是不是因为是内存数据库?
到底是什么等待ef核心保存方法比同步版本慢我还是不知道。但我能够确定问题出在内存数据库中。我不再使用它,因为我的测试涉及大量结果集 - 我使用真实的测试数据库..