Ядро C # ожидаемой сущности каркаса в операции памяти очень медленно, когда выполняется в цикле - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть такой код, который я пытаюсь выполнить модульным тестом с базой данных в оперативной памяти.

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 минут, чтобы запустить этот тест.

Это потому, что это база данных в памяти?

1 Ответ

0 голосов
/ 17 февраля 2019

В конце концов, я все еще не знаю, что ожидание метода сохранения ядра ef было медленнее, чем версия синхронизации.Но я смог определить, что проблема была в базе данных памяти.Я больше не использую его, так как мои тесты включают в себя большие наборы результатов - я использую реальную тестовую базу данных ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...