Лучший способ использовать Parallel / PLINQ для поиска ключевых слов во всех ячейках листа Excel - PullRequest
0 голосов
/ 17 сентября 2011

Как заголовок, у меня есть List<string> keywords; а также Workbook объектная модель, аналогичная Excel.

Я хотел бы получить все WorkbookCell, которые соответствуют ключевым словам в списке.

Я подумал, может быть, параллельный поиск будет хорошей идеей:

            //Loop through all the Worksheets in parallel
            Parallel.ForEach(Workbook.Worksheets, (ws, st) =>
            {
                if (!st.ShouldExitCurrentIteration)
                {
                    //Loop through all the rows in parallel
                    Parallel.ForEach(ws.Rows, (wr, tk) =>
                    {
                        if (!tk.ShouldExitCurrentIteration)
                        {
                            //Loop through all the columns in parallel
                            Parallel.ForEach(wr.Cells, (cell, ctk) =>
                            {
                                if (cell.Value != null)
                                {
                                    var cellValue = cell.Value.ToString();

                                    //Block keyword found, add the occurance
                                    var matchedKeyword = IsKeywordMatched(cellValue);

                                    if (matchedKeyword != null)
                                    {
                                        matchedKeyword.AddMatchedCell(cell);
                                    }
                                }
                            });
                        }
                    });
                }
            });

Это будет слишком много параллели на самом деле? Пожалуйста, дайте мне знать, если у вас есть лучшие идеи.

** В обычном случае у меня менее 20 листов, но каждый лист содержит более 10000 строк и сотен столбцов.

Ответы [ 2 ]

0 голосов
/ 25 января 2013

Это выглядит как хороший кандидат для распараллеливания для меня ...

worksheet.Cells.AsParallel().Select(x => new{x,KeywordMatched(x.Value.ToString())}).Where(...)...

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

СОВЕТ: Измените свою функцию IsKeywordMatched на KeywordMatched, которая возвращает строку, совпадающую с, или NULL, если там ничего нет. Затем отфильтруйте полученный запрос (.Where (...)) по записям, где stinr не равен нулю.

0 голосов
/ 18 сентября 2011

Количество параллельных потоков по умолчанию равно количеству ядер по умолчанию.Каждый параллельный цикл связан с издержками на разделение (кластеризацию) данных на n частей и их повторное объединение.Я бы сказал, что имеет смысл жить только первым циклом, если число рабочих листов больше, чем количество ядер в общем случае, в противном случае данные разделяются на втором уровне.Вложенные параллельные циклы будут только снижать производительность.Таким образом, да, вы правы, это слишком много параллелизма.

...