使用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(…)