DataTable Select vs List <T>Производительность LINQ - PullRequest
2 голосов
/ 11 мая 2011

У меня есть приложение, которое выполняет SQL и загружает набор данных в таблицу данных. В рамках обработки есть 6 или 7 DataTable.Select () для фильтрации некоторых данных. Каждый предмет, который требует обработки, занимает 300 мс. Для обработки нужно 5000 предметов, так что это займет 25 минут. Это недопустимо.

Будет ли создание POCO и загрузка их в список с последующим использованием LINQ для запроса списка быстрее, чем с использованием DataTable.Select?

Спасибо

ОБНОВЛЕНИЕ: Я углубился в немного больше, и есть 2 таблицы данных, каждая из которых содержит около 15000 записей. Два запроса, используемые для заполнения таблиц данных, занимают секунду каждый. Затем требуется 25 минут, чтобы зациклить более 5000 элементов в свойстве значений словаря и выполнить 5 DataTable.Select's

например, /

foreach (OutputRecord Mailpiece in DictionaryMailpieces.Values)
{
    try
    {
        DataRow[] R = DataTable1.Select("MAILPIECE = " + Mailpiece.MailpieceSetSequenceNumber + " AND (STATUS = 4034 OR STATUS = 4037)", "DAL_DATE desc");
        if (R != null && R.Length > 0)
        {
        }
    }
    catch
    {
    }
}

Ответы [ 4 ]

5 голосов
/ 11 мая 2011

Забавно, но с вашим вопросом нет тега "SQL". Я предлагаю вам узнать, как использовать язык SQL и его преимущества. Исходя из того, что вы говорите, вы, вероятно, с помощью своего кода создаете много декартовых продуктов вместо использования возможностей Реляционная база данных (объединения, индексы и т. Д.)

Использование перекрестных объединений DataTables или Lists или чего-либо подобного всегда приведет к значительному снижению производительности независимо от того, какой язык или платформа используется.

Тем не менее, вы можете использовать LINQ, потому что он способен генерировать умный SQL (динамически), но вы все равно хотите избегать всех ToList (), ToArray () и подобных методов расширения в IEnumerable (T), которые вызывают все базовые данные (сохраняйте его перечисляемым от начала до конца и используйте «потоковую передачу объектов» всякий раз, когда это возможно). Если вы действительно понимаете, что такое реляционная база данных и как ее эффективно использовать, вы станете лучшим разработчиком LINQ.

2 голосов
/ 11 мая 2011

Почти все будет быстрее, чем манипулировать ADO.NET DataTable - они не предназначены для быстрого поиска в любом смысле.Вы также должны поместить объекты в соответствующую структуру данных;DataTable - это красно-черное двоичное дерево строк, поэтому, если вы этого не хотите, вам не следует его использовать.

Если вы просто используете DataTable в качестве последовательной коллекциистрок с полями, вы, вероятно, увидите ускорение в 2 или более раз, просто заменив DataTable на List<T> и заменив свои Select вызовами Where, хотя это зависит отделает с этим.

РЕДАКТИРОВАТЬ: На самом деле, я передумал.Ничто из того, что вы могли бы делать с помощью сортировки или фильтрации с 5000 элементами за DataTable, не подразумевает затрат где-то близко к 300 мс, поэтому узкое место, вероятно, не связано.

0 голосов
/ 11 мая 2011

Использование LINQ, скорее всего, само по себе не приведет к значительному улучшению скорости.При этом вы могли бы потенциально использовать PLINQ для упрощения распараллеливания обработки, что позволило бы лучше масштабироваться в многоядерных системах.Это, как правило, намного проще, если использовать POCO вместо DataTable, поскольку DataTable не является поточно-ориентированным и имеет проблемы с параллелизмом.потенциальное улучшение, так как это позволит вам найти и исправить любые узкие места.Если конкретных узких мест нет, а процесс требует только такого объема необработанной обработки, кэширование также может помочь.Кроме того, возможно, что оставление данных в базе данных и использование некоторой формы ORM может также помочь, поскольку операции фильтра «6 или 7» могут выполняться на масштабируемом сервере вместо локально.Однако все это в значительной степени зависит от характера ваших данных и алгоритма, поэтому потребуется определенное внимание, чтобы определить, будет ли это полезным или вредным для всех.

0 голосов
/ 11 мая 2011

Будет ли создание POCO и загрузка их в список с последующим использованием LINQ для запроса списка быстрее, чем с использованием DataTable.Select?

Мы понятия не имеем, вы не дали нам достаточно информации. Мы понятия не имеем, как закодирован ваш метод (возможно, в вашем коде скрыт ошибочный Thread.Sleep(300); мы не можем сказать).

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

Тем не менее, переход на LINQ, вероятно, не будет в одиночку решением ваших проблем с производительностью. Что-то еще не так, и то, является ли это кодированным с использованием DataTable s и LINQ, в основном не имеет значения. Повышение производительности произойдет благодаря правильному плану атаки на вашу проблему; DataTable s и LINQ - просто способы реализации этого плана атаки.

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