@saxer

Как увеличить производительность при переборе элементов DataTable?

Суть проблемы в следующем, с помощью sql запроса я получаю таблицу с 19000 строк.
Далее мне нужно на основе данных этой таблицы заполнить другую таблицу:
for (int i = 0; i < data.Rows.Count; i++)
            {
                ClearCurrentConsoleLine(menuBaseString.Length, menuBaseString.Length + 1);
                Console.Write(i + "\\" + data.Rows.Count);
                var row = data.Rows[i];
                context.Pages.Add(new Page()
                {
                    //...
                    Catalog_Id = Convert.ToInt32(row.ItemArray[2]),
                    CatalogName = row.ItemArray[3].ToString(),
                    CatalogIdentifer = row.ItemArray[4].ToString(),
                   //...
                });
            }
context.savechanges();


Проблема в том что первые 3000 строк обрабатываются довольно быстро(5 мин) , но потом процесс перебора резко замедляется и в общей сложности такая операция занимает примерно 1,5-2 часа.
Можно ли как то оптимизировать данный код?
  • Вопрос задан
  • 262 просмотра
Решения вопроса 1
@saxer Автор вопроса
ну собственно оказалось все просто , сперва нужно создавать List со всеми объектами которые необходимо добавить, а потом делать context.AddRange
var tmp = new List<Page>();
            for (int i = 0; i < data.Rows.Count; i++)
            {
                ClearCurrentConsoleLine(menuBaseString.Length, menuBaseString.Length + 1);
                Console.Write(i + "\\" + data.Rows.Count);
                var row = data.Rows[i];
                tmp.Add(new Page()
                {
                    //...
                    Catalog_Id = Convert.ToInt32(row.ItemArray[2]),
                    CatalogName = row.ItemArray[3].ToString(),
                    CatalogIdentifer = row.ItemArray[4].ToString(),
                   //...
                });
            }
context.Pages.AddRange(tmp);


итого вместо 2 часов , 4 мин
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dmitryKovalskiy
программист средней руки
А что такое - ClearCurrentConsoleLine(menuBaseString.Length, menuBaseString.Length + 1);
Если это вывод прогресса или каких-то данных в консоль - уберите эту строчку и производительность увеличится раз в 50. А вообще запустите процесс под отладчиком и профилированием. Проверьте какие библиотеки и методы тормозят процесс.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы