Gold$Coin Ответов: 1

Приложения замедляются при получении отличных от 50k + записей из datatable в C#


У меня есть медлительность приложения, когда я предполагаю, чтобы получить отчетливый из DataTable, который имеет 50k + записей. для этого я использую приведенный ниже код

/// <summary>
   /// Generate Distinct Data Table from the Data Table Generated from server.
   /// </summary>
   Func<CancellationTokenSource, DataGridCollectionView, DataTable, DataTable> GetDistinctTable =
       (cancellationToken, DqmDataGridCollectionView, ResultDataTable) =>
       {

           var distinctCol = DqmDataGridCollectionView.SortDescriptions.ToList();
           if (distinctCol.Any())
           {

               var _distinctColumns = from n in distinctCol
                                      select new { col = n.PropertyName.Split('_')[1] }.col;

               var dtLinq20 = new DataTable();

               foreach (var item in _distinctColumns)
               {
                   var existingColumn = ResultDataTable.Columns[item];
                   var _dColumn = new DataColumn { ColumnName = existingColumn.ColumnName, DataType = existingColumn.DataType, DefaultValue = existingColumn.DefaultValue, AllowDBNull = existingColumn.AllowDBNull, Caption = existingColumn.Caption };
                   dtLinq20.Columns.Add(_dColumn);
               }

               DataTable DistinctDataTable = null;

               try
               {
                   DistinctDataTable = ResultDataTable.AsEnumerable().AsParallel().WithCancellation(cancellationToken.Token)
                    .Select(row =>
                    {
                        var newRow = dtLinq20.NewRow();
                        foreach (var item in _distinctColumns)
                        {
                            newRow[item] = row[item];
                        }

                        return newRow;
                    })
                    .Distinct(DataRowComparer.Default).CopyToDataTable();
               }
               catch (Exception)
               {
                   return null;
               }


               DistinctDataTable.TableName = "Distinct_TBL";

               return DistinctDataTable;
           }
           return null;
       };



Но для меня это занимает слишком много времени загрузки моих приложений. может ли кто-нибудь предложить мне лучшее решение?

Что я уже пробовал:

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

Patrice T

"но для меня это занимает слишком много времени загрузки моих приложений."

Gold$Coin

Код, который я вставил выше, был работой, которую я сделал в своем приложении. мне нужно знать все, что мне нужно оптимизировать с помощью кода, чтобы улучшить свою производительность.

Patrice T

О КАКОМ ВРЕМЕНИ ВЫ ГОВОРИТЕ ?

Gold$Coin

Более 4 мин.

Sinisa Hajnal

Измените запрос. Напишите хранимую процедуру, которая вернет именно те данные, которые вам нужны, в нужном вам формате. База данных умеет работать с большими массивами данных. Код использует циклы, которые медленны и неэффективны для такого рода задач. Особенно потому, что у вас есть несколько циклов, как явных, так и неявных через linq.

Philippe Mori

Правильно спроектируйте базу данных, чтобы вы могли индексировать соответствующие столбцы. Кроме того, вам может потребоваться разработать таблицы таким образом, чтобы у вас уже были различные значения в соответствующих таблицах.

Если бы мы увидели дизайн таблиц и желаемые данные, мы могли бы сделать более конкретные предложения.

Кроме того, если вы не используете весь столбец, то не загружайте (много) ненужной информации.

Gold$Coin

я обязательно попробую это сделать.

Gold$Coin

Ya столбцы базы данных хорошо определены, так как проект, над которым я работал, был инвестиционным обслуживанием системы. так что таблицы и хранимые процедуры хороши. Но манипуляция данными была сложной. потому что мы генерируем что-то вроде тепловой карты в datagrid, поэтому мы используем некоторое сложное сравнение данных. раньше, когда мы начинали работать над ним, у нас была огромная медлительность в нашем приложении. и мы использовали много логики, и некоторые внутренние фреймворки помогают сделать что-то быстрее (30%), но медленной частью было только получение отличной таблицы от фактической таблицы данных. поэтому я хочу оптимизировать это.

Philippe Mori

Ну, трудно иметь хорошее представление о вашей таблице и данных, и код кажется необычным...

Вы пробовали писать код вручную? Вы можете использовать сортировку или сортированные/хэшированные контейнеры, чтобы легко найти повторяющиеся строки...

50000 строк из одной таблицы-это не так уж много. Используя правильный алгоритм, вы должны быть в состоянии найти четкую строку в кратчайшие сроки... за исключением тех случаев, когда сами ваши ряды очень велики...

Philippe Mori

Дайте нам больше информации с конкретным образцом.

1 Ответов

Рейтинг:
2

Timo Tielens

Пожалуйста, сделайте отдельный поток, чтобы он работал в фоновом режиме. Сначала загрузите то, что вам нужно больше всего, и так далее. Найдите шаблон Proactor, это объясняет, как убедиться, что ваша программа продолжает работать.

Цитата:
Шаблон Proactor


Gold$Coin

Я уже пробовал это. если мы это сделаем, то исполнение и все подчиненные расчеты будут работать хорошо в разумные сроки. Но когда мы привязываем данные к пользовательскому интерфейсу со всеми элементами в нем (окраска/Аллигация/размер шрифта и т. д.), Это занимает много времени, поэтому я решил сделать это параллельно, и я сделал это. но только одна отчетливая часть занимает слишком много времени.