У меня есть такой код, который я пытаюсь выполнить модульным тестом с базой данных в оперативной памяти.
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();
}
Так что я зацикливаю некоторые регионы и зацикливаю циклы некоторых диапазонов дат.
Я нажму на 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 раза выполнения сохраненных изменений, что не так уж и много.Каждая из них включает вставку 30 записей, что в сумме составляет 96 000 записей.
Да, это в памяти, да, оно находится в цикле внутри асинхронного метода, который вызывает и ожидает 2 асинхронных метода, прежде чем мы сможем даже выполнить запись,но все же это заняло более 20 минут, чтобы запустить этот тест.
Это потому, что это база данных в памяти?