Улучшение производительности DataTable - PullRequest
2 голосов
/ 04 сентября 2010

У меня есть DataTable, заполненный 250 000 записей с 5 столбцами, я перебираю это как минимум 500 000 раз.

Разница в производительности между таблицей с 1000 записями огромна, и я могу понять и понять, почему- Однако есть ли способ улучшить производительность?

Ответы [ 3 ]

3 голосов
/ 04 сентября 2010

Я предполагаю, что у вас есть веская причина перебирать список 500 000 раз.

В зависимости от работы, которую вы выполняете на каждой итерации, вы можете получить выгоду от некоторой парализации рабочей нагрузки. Взгляните на TPL , вы можете использовать Parallel.ForEach , чтобы разбить работу на задачи, которые могут выполняться одновременно. Таким образом, вы можете воспользоваться преимуществами более мощного оборудования с большим количеством ядер ЦП.

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

2 голосов
/ 04 сентября 2010

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

если вы не записываете данные на каждой итерации, вам определенно пригодится многопоточность (распараллеливание)

1 голос
/ 04 сентября 2010

Я бы согласился, что у вас должна быть ОЧЕНЬ веская причина для обработки 250 тыс. Строк 500 тыс. Раз на стороне кода.Опубликуйте некоторый псевдокод и основную идею того, что вы пытаетесь достичь.

На данный момент я предполагаю, что вам действительно нужно пройти 250 тысяч записей 500 тысяч раз.Может быть, это для фрактальной серии.Если вы сделаете две относительно простые вещи в своем алгоритме, я думаю, вы значительно улучшите производительность.

  1. Считайте каждый DataRow в DataTable в созданный вами объект POCO и составьте список.из этих.DataRows и DataTables чрезвычайно дороги для работы, потому что они предназначены для обработки ЛЮБОЙ строки или таблицы, и поэтому имеют много накладных расходов, которые вам не нужны, если вы знаете структуру данных.Единовременные затраты на их извлечение, а затем на возврат, когда вы закончите, окупятся в 499 999 раз.

  2. Распараллелить процесс.Ищите способы разделить каждую итерацию между 2 и 5 рабочими процессами;на один больше, чем у вас есть ядра в вашем процессоре.Вы не будете делить время на такое количество времени, но вы увидите значительное улучшение.НЕ присваивайте каждому шагу итерации свой собственный процесс;вы будете забивать ЦП накладными расходами для управления ими.

...