R data.table的最佳键类型

R data.table的最佳键类型,r,data.table,R,Data.table,整数或更小的字符串作为data.table中的键是否更快?比如说, dt1 = data.table(x = c("a","b","c","d","e"), y= c(1,2,3,4,5)) vs dt1中的x键是否比dt2.x中的长字符串更好/更快?换句话说,字符串长度如何影响速度 谢谢 我比较了data.table对象在三种不同数据操作中具有不同大小键长度的性能。table-operation: 创建一个data.table 设置data.table的键 访问data.table中的行

整数或更小的字符串作为data.table中的键是否更快?比如说,

 dt1 = data.table(x = c("a","b","c","d","e"), y= c(1,2,3,4,5))
vs

dt1中的x键是否比dt2.x中的长字符串更好/更快?换句话说,字符串长度如何影响速度


谢谢

我比较了
data.table
对象在三种不同数据操作中具有不同大小键长度的性能。table-operation:

  • 创建一个data.table
  • 设置data.table的键
  • 访问data.table中的行
  • 代码
    库(data.table)
    图书馆(随机)
    图书馆(微基准)
    size=c(2,5,10,20)#我们将在data.tables中用作键的字符串的长度
    #生成不同长度的随机字符串:
    
    为什么不自己做基准呢?这不是讽刺。。。
    microbenchmark
    软件包使基准测试变得非常容易。在大多数问题中,我寻找绊脚石——是什么阻止提问者自己解决问题?在这个问题上,我没有看到绊脚石——这是一个很好的问题(不是我投的反对票——只是投了反对票来制衡),但我不确定你为什么不提供答案。我同意这听起来是一个有趣的问题。如果您有一个基准来显示一些差异,那么从某人那里听到它的“为什么”会更有趣。不需要防守。除了“仅仅帮助”(我把你的意思理解为回答),我们还想了解被问到了什么。通常,我们会看到一个问题问X,但实际上有问题Y,我们只能通过问OP问题而不是立即提供答案来找到答案。
     dt2 = data.table(x = c("ndjdnjndjndddjhjdhdhdbdjbjhfbdfbdfjhdbfd", "jnjwnjdndsjdsndjskndskjdnsdjsndskdnsk","jnjnsjncsccdjhcbdhjcbdcjhd","sjdnjdncjdncdcdcdccndcd","wjdndjnjcndcjdncdc"), y= c(1,2,3,4,5))
    
    library(data.table)
    library(random)
    library(microbenchmark)
    
    sizes = c(2, 5, 10, 20)  #Length of the strings we'll use as keys in the data.tables
    
    # Generate random strings of different lengths:
    randomstrings <- function(size){
      randomStrings(n = 100, len = size, upperalpha = F, digits = F, check = F)
    }
    keys <- lapply(sizes, randomstrings)  # The differently sized keys we'll use
    
    # Create data table:
    dt <- function(keys){data.table(x = keys, y = 1:100)}   
    
    # Function that chooses 5 keys randomly (used to access lines in the benchmarking):
    some5keys <- function(datatable){datatable[sample(datatable$x.V1, 5)]}
    
    ### BENCHMARKING ###
    # Creating the data.tables:
    (creationbench <- microbenchmark(dt1 <- dt(keys[[1]]), 
                                     dt2 <- dt(keys[[2]]), 
                                     dt3 <- dt(keys[[3]]), 
                                     dt4 <- dt(keys[[4]])))
    # Unit: microseconds
    # expr                 min     lq       mean     median   uq       max      neval
    # dt1 <- dt(keys[[1]]) 562.926 609.1035 714.7314 672.5955 803.7075 1117.683   100
    # dt2 <- dt(keys[[2]]) 565.636 605.7725 737.8285 661.0125 756.9390 5087.124   100
    # dt3 <- dt(keys[[3]]) 563.347 606.8465 694.8140 631.6945 754.4420 1326.753   100
    # dt4 <- dt(keys[[4]]) 578.101 622.4180 722.8112 708.4055 785.9755 1509.439   100
    
    # Setting the keys for the data.tables:
    (setkeybench <- (microbenchmark(setkey(dt1, x.V1), 
                                    setkey(dt2, x.V1), 
                                    setkey(dt3, x.V1), 
                                    setkey(dt4, x.V1))))
    # Unit: microseconds
    # expr              min    lq      mean     median  uq      max       neval
    # setkey(dt1, x.V1) 76.401 77.9530 82.28644 78.7440 81.3955 111.267   100
    # setkey(dt2, x.V1) 75.620 77.7395 91.95130 79.6885 90.6075 343.743   100
    # setkey(dt3, x.V1) 76.330 77.7900 84.21696 78.6290 83.8310 189.792   100
    # setkey(dt4, x.V1) 76.044 77.8135 85.35959 79.1675 89.8920 129.458   100
    
    # Accessing lines in the data.tables:
    (selectbench <- (microbenchmark(some5keys(dt1), 
                               some5keys(dt2),
                               some5keys(dt3),
                               some5keys(dt4))))
    # Unit: microseconds
    # expr           min     lq       mean     median   uq       max      neval
    # some5keys(dt1) 958.961 1029.778 1244.538 1131.350 1318.147 5389.407   100
    # some5keys(dt2) 968.710 1037.023 1246.963 1131.209 1302.656 5890.560   100
    # some5keys(dt3) 966.647 1025.569 1206.210 1140.247 1299.570 2221.324   100
    # some5keys(dt4) 960.804 1042.528 1218.077 1171.347 1363.010 1813.551   100