使用连接而不是合并的阈值

问题描述 投票:0回答:1

我对merge()函数(基数为R)与join()plyrdplyr函数之间差异的理解是,当使用“大”数据集时,join()更快,更有效。

有没有办法确定何时使用join()超过merge()的阈值,而不使用启发式方法?

r merge dplyr plyr
1个回答
3
投票

我相信你很难找到一个关于何时从一个功能切换到另一个功能的“硬性和快速”规则。正如其他人所提到的,R中有一套工具可以帮助您衡量绩效。 object.sizesystem.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()

enter image description here

merge似乎在门外表现更差,但真的开始大约20MB左右。这是关于此事的最后一句话吗?不。但是这样的测试可以让您了解如何选择功能。

© www.soinside.com 2019 - 2024. All rights reserved.