R 检查重复项非常慢,即使使用 mclapply

标签 r optimization multicore domc mclapply

我有一些数据涉及重复销售一堆具有唯一 ID 的汽车。一辆汽车可以卖出不止一次。

但是有些 ID 是错误的,所以我正在检查每个 ID 的尺寸是否在多次销售中记录为相同。如果不是,那么我知道 Id 是错误的。

我正在尝试使用以下代码执行此操作:

library("doMC")

Data <- data.frame(ID=c(15432,67325,34623,15432,67325,34623),Size=c("Big","Med","Small","Big","Med","Big"))
compare <- function(v) all(sapply( as.list(v[-1]), FUN=function(z) {isTRUE(all.equal(z, v[1]))}))

IsGoodId = function(Id){
  Sub = Data[Data$ID==Id,]
  if (length(Sub[,1]) > 1){
    return(compare(Sub[,"Size"]))
  }else{
    return(TRUE)
  }
}

WhichAreGood = mclapply(unique(Data$ID),IsGoodId)

但它在我的四核 i5 上非常、非常、非常慢。

谁能看出瓶颈在哪里?我是 R 优化的新手。

谢谢, -N

最佳答案

看起来您的算法进行了 N^2 次比较。也许像下面这样的东西会更好地扩展。我们找到了重复的销售额,认为这只是总数的一小部分。

dups = unique(Data$ID[duplicated(Data$ID)])
DupData = Data[Data$ID %in% dups,,drop=FALSE]

%in% 运算符的扩展性非常好。然后根据 id 拆分 size 列,检查 id 是否有一个以上的 size

tapply(DupData$Size, DupData$ID, function(x) length(unique(x)) != 1)

这给出了一个命名的逻辑向量,TRUE 表示每个 id 有不止一个大小。这与重复销售的数量大致呈线性关系;有一些聪明的方法可以让这一切变得更快,所以如果你的重复数据本身就很大......

嗯,我想再考虑一下,我想

u = unique(Data)
u$ID[duplicated(u$ID)]

成功了。

关于R 检查重复项非常慢,即使使用 mclapply,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15690688/

相关文章:

r - 使用 cmd 中的参数调用 R 函数

r - ggplot 连续尺度箱线图的多因素级别分组

python - 线程可以切换CPU吗?

c++ - MSVC 并发运行时中的 parallel_for_each 和 parallel_for 有什么区别?

memory - 现代处理器上的并行内存访问

r - 曲线的下界

json - OpenCPU 和 jsonlite : column-based "/json" versus row-based

ios - 如何用倾斜的渐变填充 CAShapeLayer

c - 优化parser函数c程序

c++ - 排序数组最快的搜索方法是什么?