我对merge()
函数(基数为R)与join()
和plyr
的dplyr
函数之间差异的理解是,当使用“大”数据集时,join()
更快,更有效。
有没有办法确定何时使用join()
超过merge()
的阈值,而不使用启发式方法?
我相信你很难找到一个关于何时从一个功能切换到另一个功能的“硬性和快速”规则。正如其他人所提到的,R中有一套工具可以帮助您衡量绩效。 object.size
和system.time
分别是两个查看内存使用和性能时间的函数。一种通用方法是直接在任意扩展的数据集上测量这两者。以下是对此的一次尝试。我们将创建一个带有“id”列和一组随机数值的数据框,允许数据框增长并测量其变化方式。当你提到inner_join
时,我会在这里使用dplyr
。我们将时间测量为“过去”时间。
library(tidyverse)
setseed(424)
#number of rows in a cycle
growth <- c(100,1000,10000,100000,1000000,5000000)
#empty lists
n <- 1
l1 <- c()
l2 <- c()
#test for inner join in dplyr
for(i in growth){
x <- data.frame("id" = 1:i, "value" = rnorm(i,0,1))
y <- data.frame("id" = 1:i, "value" = rnorm(i,0,1))
test <- inner_join(x,y, by = c('id' = 'id'))
l1[[n]] <- object.size(test)
print(system.time(test <- inner_join(x,y, by = c('id' = 'id')))[3])
l2[[n]] <- system.time(test <- inner_join(x,y, by = c('id' = 'id')))[3]
n <- n+1
}
#empty lists
n <- 1
l3 <- c()
l4 <- c()
#test for merge
for(i in growth){
x <- data.frame("id" = 1:i, "value" = rnorm(i,0,1))
y <- data.frame("id" = 1:i, "value" = rnorm(i,0,1))
test <- merge(x,y, by = c('id'))
l3[[n]] <- object.size(test)
# print(object.size(test))
print(system.time(test <- merge(x,y, by = c('id')))[3])
l4[[n]] <- system.time(test <- merge(x,y, by = c('id')))[3]
n <- n+1
}
#ploting output (some coercing may happen, so be it)
plot <- bind_rows(data.frame("size_bytes" = l3, "time_sec" = l4, "id" = "merge"),
data.frame("size_bytes" = l1, "time_sec" = l2, "id" = "inner_join"))
plot$size_MB <- plot$size_bytes/1000000
ggplot(plot, aes(x = size_MB, y =time_sec, color = id)) + geom_line()
merge
似乎在门外表现更差,但真的开始大约20MB左右。这是关于此事的最后一句话吗?不。但是这样的测试可以让您了解如何选择功能。