0

作为标题,我有一个类似于 Excel 的对象模型List<string> keywords;Workbook

我想获取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 行和数百列。

4

2 回答 2

0

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

于 2011-09-17T22:16:02.627 回答
0

对我来说,这看起来是一个很好的并行候选者......

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

与可用内核数量相比,应该会给您带来几乎线性的性能改进。

提示:将 IsKeywordMatched 函数更改为 KeywordMatched,它返回匹配的字符串,如果不存在则返回 NULL。然后通过 stinr 不为空的记录过滤结果查询 (.Where(...))。

于 2013-01-25T12:29:37.447 回答