使用Parallel/PLINQ在所有Excel工作表单元格中查找关键字的最佳方法

使用Parallel/PLINQ在所有Excel工作表单元格中查找关键字的最佳方法,excel,plinq,parallel.foreach,Excel,Plinq,Parallel.foreach,作为标题,我有一个列表关键字 还有一个类似于Excel的工作簿对象模型 我想获取与列表中的关键字匹配的所有WorkbookCell 我在想也许并行搜索是个好主意: //Loop through all the Worksheets in parallel Parallel.ForEach(Workbook.Worksheets, (ws, st) => { if (!st.ShouldE

作为标题,我有一个
列表关键字
还有一个类似于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行和数百列。

默认并行线程数等于每个默认线程的内核数。
每个并行循环都与将数据拆分(聚类)为n个部分并再次合并它们的开销有关。我想说的是,如果工作表的数量大于普通情况下的核心数量,那么只使用第一个循环是有意义的,否则在第二个级别上分割数据。嵌套的并行循环只会降低性能。因此,是的,你是对的,这太平行了

对我来说,这似乎是一个很好的并行处理的候选者

worksheet.Cells.AsParallel().Select(x => new{x,KeywordMatched(x.Value.ToString())}).Where(...)...
与可用的内核数量相比,性能提升几乎是线性的

提示:将IsKeywordMatched函数更改为KeywordMatched,如果不存在任何内容,则返回匹配的字符串或NULL。然后根据stinr不为null的记录过滤结果查询(.Where(…)