R并行处理中foreach的combine参数结果合并方案咨询
你现在的写法每个迭代都会返回完整的原始数据框副本,用rbind合并自然会把所有副本堆叠起来,导致行数等于原行数×迭代次数。除了事后聚合,还有两种更直接的实现方式:
方案1:自定义foreach合并函数
直接在合并阶段按文本主键累加匹配标记,不需要后续额外聚合,改写下foreach的combine参数即可:
a = foreach(i = seq_along(z) , .packages = c("data.table") , .combine = function(dt1, dt2) { # 按text字段匹配,累加匹配标记 dt1[dt2, on = .(text), flag_matched := flag_matched + i.flag_matched] return(dt1) } ) %dopar% { df[, flag_matched := as.numeric(grepl(z[[i]], text, perl=T)) ] }
注意这里迭代内不需要累加全局的flag_matched,每个迭代仅返回当前规则的匹配结果即可,合并逻辑会自动完成累加。
方案2:仅返回匹配标记向量,简化合并逻辑
不需要每次传递整个数据框,仅返回当前迭代的匹配结果向量,直接用加法合并,性能更高:
# 不需要提前初始化flag_matched列 a = foreach(i = seq_along(z) , .packages = c("data.table") , .combine = `+` ) %dopar% { as.numeric(grepl(z[[i]], df$text, perl=T)) } # 直接把求和后的结果赋值给原表即可 df[, flag_matched := a]
另外注意一个小问题:R字符串里的转义字符需要双写,你现在写的"\b"实际不会被识别为正则的单词边界,需要改成"\\b"才能正常生效。
内容的提问来源于stack exchange,提问作者Sweepy Dodo
相关产品推荐
相关产品推荐

