Скорость обработки данных - C# (183555)
Формулировка задачи:
Добрый день, всем.
Прошу оказать помощь в вопросе оптимальной обработки данных в циклах. Ситуация следующая:
Программа должна получить данные из трех таблиц и создать четвертую. Вот такой код (сократил):
Имеем время выполнения порядка 15 минут.
Если закоментировать первый или второй цикл внутри foreach время обработки составит 10-15 секунд. Причем что первый, что второй отрабатывают по отдельности примерно одинаково по времени, хотя второй по количеству операций и числу строк в разы превышает первый.
Т.е. последовательно
foreach
цикл 1
запись в БД
foreach
цикл 2
запись в БД
время обработки данных составит секунд 25-30. Не могу понять, в чем в данном случае разница от реализации
foreach
{
цикл 1
цикл 2
}
запись в БД
Ведь по сути количество операций не меняется. Помогите разобраться.
P.S. Последовательный вариант не подходит, т.к. получается строки идентификатор+данные цикла1, а потом еще раз идентификатор+данные цикла2, а должно быть идентификатор+данные цикла1+данные цикла2.
list_ZNR_new = list_ZNR.Distinct().ToList(); // список идентификаторов примерно 7000 по количеству (из первой таблицы)
foreach (Int32 c in list_ZNR_new) // по каждому из идентефикаторов берем данные из двух других таблиц
{
/////////////////////// ПЕРВЫЙ ЦИКЛ
for (int i = 0; i < temp_FOT_analise_count; i++ ) // вторая таблица - примерно тоже 7000 строк
{
if (c == temp_FOT_analise[i].Remont_num)
{
_Summa_mat = (Double)temp_FOT_analise[i].Summa_mat; // запись нужного значения из второй таблицы во временную переменную
break;
}
}
///////////////////////////////////////
/////////////////////// ВТОРОЙ ЦИКЛ
for (int j = 0; j < All; j++) // третья таблица - примерно 40000 строк
{
if (list_ZNR[j].Equals(c) && (list_Role[j].Contains("Продавец труд") || list_Role[j].Contains("Контракт труд")))
{
_FOT_prod_trud = _FOT_prod_trud + list_Bonus[j]; // запись нужного значения из третей таблицы во временную переменную
_davnost = list_Davnost[j];
}
// ...... в цикле в разы больше операций чем во второй таблице
}
//////////////////////////////////
//// ФОРМИРОВАНИЕ КОНЕЧНОЙ ТАБЛИЦЫ ПО ПОЛУЧЕННЫМ ВЫШЕ ДАННЫМ
FOT_analise Temp = new FOT_analise
{
ID = key++,
// заполнение таблицы данными
};
db.FOT_analise.InsertOnSubmit(Temp);
}
db.SubmitChanges();
}Решение задачи: «Скорость обработки данных»
textual
Листинг программы
_Summa_rashod = temp_FOT_analise[i].Summa_rashod.Value; _Truck = temp_FOT_analise[i].Truck_model; _klient = temp_FOT_analise[i].Klient;