Data.table: рдСрдкрд░реЗрд╢рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рдзреАрдорд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдЕрдХреНрддреВре░ 2019  ┬╖  29рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Rdatatable/data.table

рдирдорд╕реНрддреЗ, рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рдерд╛
data.table_1.10.4-3 + R рд╕рдВрд╕реНрдХрд░рдг 3.4.0 (2017-04-21)
рдмрдирд╛рдо
data.table_1.12.2 + R рд╕рдВрд╕реНрдХрд░рдг 3.6.1 (2019-07-05)

рдФрд░ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдбреЗрдЯрд╛ рдореЗрдВ рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред рддрд╛рд▓рд┐рдХрд╛ (рдЖрд░?)
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рддрд╛рд▓рд┐рдХрд╛

rm(list=ls())

library(data.table)
library(tictoc)


aa = data.table(a = seq(1,100), b = rep(0, 100))
bb = data.table(a = seq(1,100), b = rep(1, 100))

#aa[,  a1 := as.character(a)]
#bb[,  a1 := as.character(a)]

setindex(aa, a)
setindex(bb, a)

tic()
for(i in c(1:1000)) {
 # aa[bb, b := i.b, on=.(a, a1)] # test1
  aa[bb, b := i.b, on=.(a)] # test2
}
toc()

# test1
# 3.6.1: 5.5 sec with index
# 3.6.1: 6.87 sec without index
# 3.4.0: 3.02 sec (no index)

# test2
# 3.6.1: 3.82 sec with index
# 3.6.1: 4.44 sec without index
# 3.4.0: 2.48 sec (no index)
High joins performance regression

рд╕рднреА 29 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд▓рд╛ рд╣реИ:

# run_join_time.sh
echo 'hash,time' > 'join_timings.csv'

for HASH in $(git rev-list --ancestry-path 1.10.0..1.12.4 | awk 'NR == 1 || NR % 10 == 0');
do git checkout $HASH && R CMD INSTALL . && Rscript time_join.R $HASH;
done
# time_join.R
library(data.table)
library(microbenchmark)

hash = commandArgs(trailingOnly = TRUE)

aa = data.table(a = seq(1,100), b = rep(0, 100))
bb = data.table(a = seq(1,100), b = rep(1, 100))

fwrite(data.table(
  hash = hash,
  time = microbenchmark(times = 1000L, aa[bb, b := i.b, on=.(a)])$time
), 'join_timings.csv', append = TRUE)

рдлрд┐рд░ рдЗрд╕ рдкреНрд▓реЙрдЯ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд┐рдпрд╛

Screenshot 2019-10-03 at 6 59 11 PM

library(data.table)
times = fread('join_timings.csv')

times[ , date := as.POSIXct(system(sprintf("git show --no-patch --no-notes --pretty='%%cd' %s", .BY$hash), intern = TRUE), by = hash]
times[ , date := as.POSIXct(date, format = '%a %b %d %T %Y %z', tz = 'UTC')]
times[ , date := as.IDate(date)]
setorder(times, date)

tags = system('
for TAG in $(git tag);
  do git show --no-patch --no-notes --pretty="$TAG\t%cd" $TAG;
done
', intern = TRUE)

tags = setDT(tstrsplit(tags, '\t'))
setnames(tags, c('tag', 'date'))
tags[ , date := as.POSIXct(date, format = '%a %b %d %T %Y %z', tz = 'UTC')]
tags[ , date := as.IDate(date)]

times[ , {
  par(mar = c(7.1, 4.1, 2.1, 2.1))
  y = boxplot(I(time/1e6) ~ date, log = 'y', notch = TRUE, pch = '.',
              las = 2L, xlab = '', ylab = 'Execution time (ms)', cex.axis = .8)
  x = unique(date)
  idx = findInterval(tags$date, x)
  abline(v = idx[idx>0L], lty = 2L, col = 'red')
  text(idx[idx>0L], .7*10^(par('usr')[4L]), tags$tag[idx>0L], 
       col = 'red', srt = 90)
  NULL
}]


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ

echo 'hash,time,date' > 'join_timings.csv'

for HASH in $(git rev-list --ancestry-path 1.10.0..1.12.4 | awk 'NR == 1 || NR % 10 == 0');
do git checkout $HASH && R CMD INSTALL . --preclean && Rscript time_join.R $HASH $(git show --no-patch --no-notes --pretty='%cd' $HASH);
done
library(data.table)
library(microbenchmark)

args = commandArgs(trailingOnly = TRUE)
hash = args[1L]
date = as.POSIXct(args[2L], format = '%a %b %d %T %Y %z', tz = 'UTC'))

aa = data.table(a = seq(1,100), b = rep(0, 100))
bb = data.table(a = seq(1,100), b = rep(1, 100))

fwrite(data.table(
  hash = hash,
  date = date,
  time = microbenchmark(times = 1000L, aa[bb, b := i.b, on=.(a)])$time
), 'join_timings.csv', append = TRUE)

рдкреНрд░рддрд┐рдмрджреНрдз рд╕рдордп рдХреЛ рд╕реАрдзреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП

join_times.txt

рд╣рд╛рдп рдорд╛рдЗрдХрд▓ рдЪрд┐рд░рд┐рдХреЛ, рдореИрдВрдиреЗ рджреЛ рдмрд╛рд░ рдкрдврд╝рд╛ рд╣реИ
рд▓реЗрдХрд┐рди 2016 рд╕реЗ 2019 рддрдХ рдХреА рдЯрд╛рдЗрдорд▓рд╛рдЗрди рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдбреЗрдЯрд╛рдЯреЗрдмрд▓ рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ?

рди рдХреЗрд╡рд▓ рд╕рдВрд╕реНрдХрд░рдг рдмрд▓реНрдХрд┐ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдорд┐рдЯред рдореБрдЭреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдХреБрдЫ рд╕реАрдорд╛рдВрдХрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рджреЗрдВ, рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдЬрд┐рд╕реЗ рдореИрдВ рдЬреЛрдбрд╝рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдерд╛

@MichaelChirico рдЖрдкрдХрд╛ рдЧреНрд░рд╛рдл рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдпрд╛рдж рдЖ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдЙрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдереА :) рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдХрд░ рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ 100 рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдлрд╝реЛрд░реНрдбрд░ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдорд╛ рд╣реИред рдХреМрди рд╕рд╛ рдЖрдИрдПрдордУ рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдЕрднреА рднреА рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рд╣реИрдВред рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рд▓реЗрдХрд┐рди рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдХрдореА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред 100 рдЗрдирдкреБрдЯ рдХреА рд▓рдВрдмрд╛рдИ рдкрд░ 10000 рдмрд╛рд░ рд▓реВрдкрд┐рдВрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИред

1.12.0 рд╕рдорд╛рдЪрд╛рд░ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдореЗрд░рд╛ рднреА рдпрд╣реА рдЕрдиреБрдорд╛рди рдерд╛ред рд╕рд┐рдВрдЧрд▓ рдереНрд░реЗрдбреЗрдб рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред

@jangorecki , рдпрджрд┐ рдЖрдк рд╕рд░рд▓ рдЧрдгрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╣рдЬрд╛рд░реЛрдВ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рдпрд╛рдиреА рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╣реИ
рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреА рдкреНрд░реЗрд░рдгрд╛ рдореЗрд░реА рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдереА рдЬрд╣рд╛рдВ рдореИрдВ 40,000 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде 7-8 рдмрд╛рд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддрд╛ рд╣реВрдВ
рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ 18 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ, рдмрд╛рдж рдореЗрдВ 40 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ
рдореЗрд░реЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╡рд░реНрдг рдХреБрдВрдЬреА рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ
рдореИрдВрдиреЗ 3.6+1.12 рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ 3.4+1.10 . рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдпрд╛
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ рдореБрджреНрджрд╛ рдпрд╣рд╛рдБ рд╣реИ

рд╣рд╛рдБ рдЧреНрд░рд╛рдлрд╝ рд╡рд╛рдХрдИ рдХрдорд╛рд▓ рдХрд╛ рд╣реИ; рд╣рдореЗрдВ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд▓реЗрдХрд┐рди рдореВрд▓ рд░рд┐рдкреЛрд░реНрдЯ R 3.4 рдХреА рддреБрд▓рдирд╛ R 3.6 рд╕реЗ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рдореЗрдВ R 3.5 рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрд░ 3.5 рдиреЗ рдореИрдХреНрд░реЛрдЬрд╝ рд╕реЗ (рдереЛрдбрд╝рд╛ рднрд╛рд░реА) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП ALTREP рдХреЗ REAL (), INTEGER () рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ data.table рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ред

@ vk111 рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рд╕реАрдЖрд░рдПрдПрди рдкрд░ рдЕрдм v1.12.4 рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рджреЛрдмрд╛рд░рд╛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдмреЗрд╣рддрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛? рд╣рдо R 3.5+ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП R API рдХреЛ рд▓реВрдк рд╕реЗ рдмрд╛рд╣рд░ рд▓реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЕрдЧрд▓реЗ рдЪрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЬрд╛рдирдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк v1.12.4 рдХреЛ рдХреИрд╕реЗ рдвреВрдВрдврддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреА рдорд╢реАрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рднреА рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЬреИрд╕реЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо, рд░реИрдо рдФрд░ рд╕реАрдкреАрдпреВ рдХреА рд╕рдВрдЦреНрдпрд╛ред

@matt , рдХрд░реЗрдВрдЧреЗ

рд╣рд╛рдп @mattdowle ,

Ive рдХреЛ 1.12.4 (+R 3.6.1) рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ - рдореВрд▓ рд░реВрдк рд╕реЗ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдФрд░ my func рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЕрдВрдХ рд╣реИрдВ
рдореИрдВ рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдЕрдиреБрдХреНрд░рдордг рдХреЗ рдмрд┐рдирд╛ рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ - рдПрдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ
рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ (рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)
3.6.1: 6.87 рд╕реЗрдХреЗрдВрдб рдмрд┐рдирд╛ рдЗрдВрдбреЗрдХреНрд╕
3.4.0: 3.02 рд╕реЗрдХрдВрдб (рдХреЛрдИ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдирд╣реАрдВ)

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдореЗрд░рд╛ рдХрд╛рд░реНрдп рд╡рд╣реА рд░рд╣рддрд╛ рд╣реИ: 20 рдмрдирд╛рдо 40 рд╕реЗрдХреЗрдВрдб
рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ ~14 рдбреАрдЯреА рдЬреЙрдЗрди рд╣реЛрддреЗ рд╣реИрдВ
рджреЛ рдЯреЗрдмрд▓ 30 000 рдкрдВрдХреНрддрд┐рдпрд╛рдБ (dt1) рдФрд░ 366 000 рдкрдВрдХреНрддрд┐рдпрд╛рдБ (dt2)
15 рдХреЙрд▓рдо рдкреНрд░рддреНрдпреЗрдХ
рдХреБрдВрдЬреА 2 рд╡рд░реНрдг рдФрд░ 1 рдЕрдВрдХреАрдп рд╣реИ
рдФрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди 7 рдлрд╝реАрд▓реНрдб (dt1 рд╕реЗ dt2 рддрдХ) рдЕрд╕рд╛рдЗрди рдХрд┐рдП рдЧрдП

рдореЗрд░рд╛ рдкреАрд╕реА:
рд╡рд┐рди 10 64 рдмрд┐рдЯ
рдПрдПрдордбреА рдП8 2.2 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ
8 рдЬреАрдмреА рд░реИрдо

cmd: wmic cpu рдХреЛ NumberOfCores, NumberOfLogicalProcessors/ Format:List . рдорд┐рд▓рддрд╛ рд╣реИ
рдирдВрдмрд░рдСрдлрдХреЛрд░=4
NumberOfLogicalProcessors=4

рдЖрдкрдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рд╣рд╛рдп @mattdowle рддреЛ рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдПрдХ git bisect рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореИрдВ рдЕрднреА рдлрд┐рд░ рд╕реЗ рджреМрдбрд╝рд╛, рдпрд╣ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдзреАрдореА рдЧрддрд┐ рдХреЗ рд▓рд┐рдП "рджреЛрд╖реА" рд╣реИ, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдЯ рдХреЛ рдЬрдбрд╝ рд╕реЗ рдиреАрдЪреЗ рдкрд┐рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рдпрд╣ forder рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдпрд╣ рдореБрдЭреЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд┐рди рдХрд┐рдпрд╛ рд╣реИред

https://github.com/Rdatatable/data.table/commit/e59ba149f21bb35098ed0b527505d5ed6c5cb0db

рдЬреНрдпрд╛рджрд╛ рдареАрдХ:

# run_join_time.sh
R CMD INSTALL . && Rscript time_join.R
# time_join.R
library(data.table)
library(microbenchmark)

aa = data.table(a = seq(1,100), b = rep(0, 100))
bb = data.table(a = seq(1,100), b = rep(1, 100))

summary(microbenchmark(times = 1000L, aa[bb, b := i.b, on=.(a)])$time/1e6)

рдЗрди рджреЛ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, master/HEAD рд╕реЗ:

git checkout 1.12.0
git bisect start
git bisect bad
git bisect good 1.11.8

рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, sh run_join_time.sh рдЪрд▓рд╛рдПрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЬрд╛рдВрдЪреЗрдВред bad рдореЗрд░реА рдорд╢реАрди рдкрд░ рд▓рдЧрднрдЧ .9 рд╕реЗрдХрдВрдб рдкреНрд░рддрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд▓реЗ рд░рд╣рд╛ рдерд╛, good рд▓рдЧрднрдЧ .7 рдХрд░рддрд╛ рд╣реИред

рд╣рд╛рдп рдорд╛рдЗрдХрд▓, рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рдЧрд┐рд░рд╛рд╡рдЯ рдЖрдИ рд╣реИ
рдХреИрд░реЗрдХреНрдЯрд░ рдХреА- I рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рд╡реИрд╕реЗ рднреА рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдореИрдЯ рд╕реЗ рдкреБрд╖реНрдЯрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рддрдп рд╣реИ
рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдирд╣реАрдВ

рдЧреБрд░реБ, 26 рджрд┐рд╕рдВрдмрд░ 2019 рдХреЛ 15:02 рдмрдЬреЗ, рдорд╛рдЗрдХрд▓ рдЪрд┐рд░рд┐рдХреЛ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдПрдХ git bisect рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореИрдВ рдЕрднреА рдлрд┐рд░ рд╕реЗ рднрд╛рдЧрд╛, рдпрд╣ рдХрдорд┐рдЯ рдХреЗ рд▓рд┐рдП "рджреЛрд╖реА" рд╣реИ
рдзреАрдорд╛, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдЯ рдХреЛ рдЬрдбрд╝ рд╕реЗ рдиреАрдЪреЗ рдкрд┐рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рд╡рд╣ рдпрд╣ рд╣реИ
forder рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдореБрдЭреЗ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╡рд┐рд╢реНрд╡рд╛рд╕ рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЗрд╕реЗ рдиреАрдЪреЗ рдкрд┐рди рдХрд░ рджрд┐рдпрд╛ рд╣реИ
рд╕рд╣реА рдврдВрдЧ рд╕реЗред

e59ba14
https://github.com/Rdatatable/data.table/commit/e59ba149f21bb35098ed0b527505d5ed6c5cb0db

рдЬреНрдпрд╛рджрд╛ рдареАрдХ:

run_join_time.sh

рдЖрд░ рд╕реАрдПрдордбреА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред && рдкреНрд░рддрд┐рд▓реЗрдЦ time_join.R

time_join.R

рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдбреЗрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛)
рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдорд╛рдЗрдХреНрд░реЛрдмреЗрдВрдЪрдорд╛рд░реНрдХ)

рдЖ = рдбреЗрдЯрд╛ред рддрд╛рд▓рд┐рдХрд╛ (рдП = рд╕реЗрдХ (1,100), рдмреА = рдкреНрд░рддрд┐рдирд┐рдзрд┐ (0, 100))
рдмреАрдмреА = рдбреЗрдЯрд╛ред рдЯреЗрдмрд▓ (рдП = рд╕реЗрдХ (1,100), рдмреА = рдкреНрд░рддрд┐рдирд┐рдзрд┐ (1, 100))

рд╕рд╛рд░рд╛рдВрд╢ (рдорд╛рдЗрдХреНрд░реЛрдмреЗрдВрдЪрдорд╛рд░реНрдХ (рд╕рдордп = 1000 рдПрд▓, рдЖ [рдмреАрдмреА, рдмреА: = рдЖрдИрдмреА, рдкрд░ =ред (рдП)]) $ рд╕рдордп / 1e6)

рдЗрди рджреЛ рд▓рд┐рдкрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде, рдорд╛рд╕реНрдЯрд░/рд╣реЗрдб рд╕реЗ:

рдЧрд┐рдЯ рдЪреЗрдХрдЖрдЙрдЯ 1.12.0
рдЧрд┐рдЯ рдмрд╛рдЗрд╕реЗрдХреНрдЯ рд╕реНрдЯрд╛рд░реНрдЯ
рдЧрд┐рдЯ рдмрд╛рдЗрд╕реЗрдХреНрдЯ рдЦрд░рд╛рдм
рдЧрд┐рдЯ рджреНрд╡рд┐рднрд╛рдЬрд┐рдд рдЕрдЪреНрдЫрд╛ 1.11.8

рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, sh run_join_time.sh рдЪрд▓рд╛рдПрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдЬрд╛рдВрдЪреЗрдВред
рдЦрд░рд╛рдм рдХрд╛рдо рдореЗрд░реА рдорд╢реАрди рдкрд░ рд▓рдЧрднрдЧ .9 рд╕реЗрдХрдВрдб рдкреНрд░рддрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд▓реЗ рд░рд╣реЗ рдереЗ,
рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ .7 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Rdatatable/data.table/issues/3928?email_source=notifications&email_token=ABRM7MJQITNUZDNYV7NTIX3Q2S2ORA5CNFSM4I4ZPREKYY3PNVWWK3TUL52HS4DFVREXG43VMVB4#LOVZHTRNMVXH
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABRM7MOTZRFFM2QKVFUHT6LQ2S2ORANCNFSM4I4ZPREA
.

>

рд╕рд╛рджрд░,
рд╡рд╕реАрд▓реА рдХреБрдЬрд╝рдиреЗрддреНрд╕реЛрд╡

@ vk111 рдпрджрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдмрдВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЕрднреА рддрдХ рдареАрдХ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред рдЬрдм рднреА рд╣рдо рдХреБрдЫ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВред

@ vk111 рдЖрдк $#$ setindex $#$ рдХреЗ рдмрдЬрд╛рдп setkey рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЖрдзреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ:

aa = data.table(a = seq(1,100), b = rep(0, 100))
bb = data.table(a = seq(1,100), b = rep(1, 100))

aa[,  a1 := as.character(a)]
bb[,  a1 := as.character(a)]

tic()
for(i in c(1:1000)) {
  aa[bb, b := i.b, on=.(a, a1)] # test1 without key
}
toc()
## 4 sec elapsed

tic()
setkey(aa, a, a1)
setkey(bb, a, a1)

for(i in c(1:1000)) {
  aa[bb, b := i.b] # test2 without key
}
toc()
## 1.46 sec elapsed

image

library(microbenchmark)
library(data.table)

aa = data.table(a = seq(1,100), b = rep(0, 100))
bb = data.table(a = seq(1,100), b = rep(1, 100))

aa[,  a1 := as.character(a)]
bb[,  a1 := as.character(a)]

aa_nokey = copy(aa)
bb_nokey = copy(bb)

tic()
aa_int_key = setkey(copy(aa), a)
bb_int_key = setkey(copy(bb), a)
toc()

tic()
aa_int_char = setkey(copy(aa), a, a1)
bb_int_char = setkey(copy(bb), a, a1)
toc()
int_nokey = function(dt1, dt2){
  dt1[dt2, b := i.b, on=.(a)]
}

int_key = function(dt1, dt2){
  dt1[dt2, b := i.b]
}

int_char_nokey = function(dt1, dt2){
  dt1[dt2, b := i.b, on=.(a, a1)]
}

int_char_key = function(dt1, dt2){
  dt1[dt2, b := i.b]
}

int_char_key_on = function(dt1, dt2){
  dt1[dt2, b := i.b, on=.(a, a1)]
}

boxplot(
  microbenchmark(
    a_no_key = int_nokey(aa, bb),
    a_key = int_key(aa_int_key, bb_int_key),
    a_a1_no_key = int_char_nokey(aa, bb),
    a_a1_key = int_char_key(aa_int_char, bb_int_char),
    a_a1_key_on = int_char_key_on(aa_int_char, bb_int_char)
  )
)

рд╣рд╛рдп рдХреЛрд▓, рд╣рд╛рдБ рдореБрдЭреЗ рд╕реЗрдЯрдХреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ - рдореИрдВрдиреЗ рдКрдкрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджрд┐рдпрд╛ рд╣реИ
рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдФрд░ 1000 рдЬреБрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдЙрджреНрджреЗрд╢реНрдп рдирд╣реАрдВ рд╣реИ - 10-20 . рдХреА рддрд░рд╣ рд╣реИрдВ
рдЬреБрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдЪрд░рд┐рддреНрд░ рддрд╛рд░ рдмрд╣реБрдд рдЧрддрд┐рд╢реАрд▓ рд╣реИрдВ рдФрд░ I
20 рдмрд╛рд░ рд╕реЗрдЯрдХреА рдФрд░ 20 рдХреА рддрд░рд╣ рдЬреБрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд░ рдмрд╛рд░ рд╕реЗрдЯрдХреА рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ
рдмрд╛рд░ рдЬреБрдбрд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдордп рдореЗрдВ рд▓рд╛рдн 2 рдЧреБрдирд╛ рд╕реЗ рдХрдо рд╣реИ
рдореИрдВ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдХреЗ рд▓рд┐рдП 3.4.0 рдХреЗ рд╕рд╛рде рд░рд╣рддрд╛ рд╣реВрдВ
рдФрд░ рд╢рд╛рдпрдж рдЗрд╕реЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдареАрдХ рдХрд░рдирд╛ рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░
рдПрдХ рджреЛрд╖реА рдкреНрд░рддрд┐рдмрджреНрдз рдкрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ
рд╡реИрд╕реЗ рдЕрдЧрд░ рд╣рдо рд╕реЗрдм рдХреА рддреБрд▓рдирд╛ рд╕реЗрдм рд╕реЗ рдХрд░реЗрдВ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 3.4(1.10) рд╣реЛрдЧрд╛
рдЕрднреА рднреА 3.6 (1.12) рд╕реЗ рддреЗрдЬ рд╣реИ рдЕрдЧрд░ рдореИрдВ рдЙрд╕реА рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реЗрдЯрдХреА рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реВрдВ
рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдг
рдЫреБрдЯреНрдЯрд┐рдпреЛрдВ рдХреА рд╢реБрднрдХрд╛рдордирд╛рдПрдВ

рд╕реВрд░реНрдп рдХреЛ, 29 рджрд┐рд╕рдВрдмрд░ 2019, 14:48 рдХреЛрд▓ рдорд┐рд▓рд░, рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@vk111 https://github.com/vk111 рдЖрдк рдХреБрдЫ рдХреЗ рд╕рд╛рде рдХрдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
рд╕реЗрдЯрдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп рд╕реЗрдЯрдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ред рдпрд╣ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХрдЯреМрддреА рдХрд░рддрд╛ рд╣реИ
рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЖрдзреЗ рд╕реЗ рдЕрдзрд┐рдХ:

рдЖ = рдбреЗрдЯрд╛ред рддрд╛рд▓рд┐рдХрд╛ (рдП = рд╕реЗрдХ (1,100), рдмреА = рдкреНрд░рддрд┐рдирд┐рдзрд┐ (0, 100))
рдмреАрдмреА = рдбреЗрдЯрд╛ред рдЯреЗрдмрд▓ (рдП = рд╕реЗрдХ (1,100), рдмреА = рдкреНрд░рддрд┐рдирд┐рдзрд┐ (1, 100))

рдЖ [, a1 := as.character(a)]
bb[, a1 := as.character(a)]

рдЯрд┐рдХ ()
рдХреЗ рд▓рд┐рдП (рдореИрдВ рд╕реА рдореЗрдВ (1:1000)) {
рдПрдП [рдмреАрдмреА, рдмреА: = рдЖрдИрдмреА, рдСрди =ред (рдП, рдП 1)] # рдЯреЗрд╕реНрдЯ 1 рдмрд┐рдирд╛ рдХреБрдВрдЬреА
}
рдЯреАрдУрд╕реА ()

4 рд╕реЗрдХрдВрдб рдмреАрдд рдЧрдП

рдЯрд┐рдХ ()
рд╕реЗрдЯрдХреА (рдПрдП, рдП, рдП 1)
рд╕реЗрдЯрдХреА (рдмреАрдмреА, рдП, рдП 1)

рдХреЗ рд▓рд┐рдП (рдореИрдВ рд╕реА рдореЗрдВ (1:1000)) {
рдПрдП [рдмреАрдмреА, рдмреА: = рдЖрдИрдмреА] # рдЯреЗрд╕реНрдЯ 2 рдмрд┐рдирд╛ рдХреБрдВрдЬреА
}
рдЯреАрдУрд╕реА ()

1.46 рд╕реЗрдХрдВрдб рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВ

[рдЫрд╡рд┐: рдЫрд╡рд┐]
https://user-images.githubusercontent.com/57992489/71557665-126d7880-2a17-11ea-8664-21a10deb47ca.png

рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдорд╛рдЗрдХреНрд░реЛрдмреЗрдВрдЪрдорд╛рд░реНрдХ)
рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдбреЗрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛)

рдЖ = рдбреЗрдЯрд╛ред рддрд╛рд▓рд┐рдХрд╛ (рдП = рд╕реЗрдХ (1,100), рдмреА = рдкреНрд░рддрд┐рдирд┐рдзрд┐ (0, 100))
рдмреАрдмреА = рдбреЗрдЯрд╛ред рдЯреЗрдмрд▓ (рдП = рд╕реЗрдХ (1,100), рдмреА = рдкреНрд░рддрд┐рдирд┐рдзрд┐ (1, 100))

рдЖ [, a1 := as.character(a)]
bb[, a1 := as.character(a)]

рдЖ_рдиреЛрдХреА = рдХреЙрдкреА (рдПрдП)
bb_nokey = рдХреЙрдкреА (рдмреАрдмреА)

рдЯрд┐рдХ ()
рдПрдП_рдЗрдВрдЯ_рдХреА = рд╕реЗрдЯрдХреА (рдХреЙрдкреА (рдПрдП), рдП)
bb_int_key = рд╕реЗрдЯрдХреА (рдХреЙрдкреА (рдмреАрдмреА), рдП)
рдЯреАрдУрд╕реА ()

рдЯрд┐рдХ ()
рдПрдП_рдЗрдВрдЯ_рдЪрд╛рд░ = рд╕реЗрдЯрдХреА (рдХреЙрдкреА (рдПрдП), рдП, рдП 1)
bb_int_char = рд╕реЗрдЯрдХреА (рдХреЙрдкреА (рдмреАрдмреА), рдП, рдП 1)
рдЯреАрдУрд╕реА ()
int_nokey = рдлрд╝рдВрдХреНрд╢рди (рдбреАрдЯреА 1, рдбреАрдЯреА 2) {
рдбреАрдЯреА 1 [рдбреАрдЯреА 2, рдмреА: = рдЖрдИрдмреА, рдкрд░ =ред (рдП)]
}

int_key = рдлрд╝рдВрдХреНрд╢рди (рдбреАрдЯреА 1, рдбреАрдЯреА 2) {
рдбреАрдЯреА 1 [рдбреАрдЯреА 2, рдмреА: = рдЖрдИрдмреА]
}

int_char_nokey = рдлрд╝рдВрдХреНрд╢рди (рдбреАрдЯреА 1, рдбреАрдЯреА 2) {
рдбреАрдЯреА 1 [рдбреАрдЯреА 2, рдмреА: = рдЖрдИрдмреА, рдкрд░ =ред (рдП, рдП 1)]
}

int_char_key = рдлрд╝рдВрдХреНрд╢рди (рдбреАрдЯреА 1, рдбреАрдЯреА 2) {
рдбреАрдЯреА 1 [рдбреАрдЯреА 2, рдмреА: = рдЖрдИрдмреА]
}

int_char_key_on = рдлрд╝рдВрдХреНрд╢рди (рдбреАрдЯреА 1, рдбреАрдЯреА 2) {
рдбреАрдЯреА 1 [рдбреАрдЯреА 2, рдмреА: = рдЖрдИрдмреА, рдкрд░ =ред (рдП, рдП 1)]
}

рдмреЙрдХреНрд╕ рдкреНрд▓реЙрдЯ(
рдорд╛рдЗрдХреНрд░реЛрдмреЗрдВрдЪрдорд╛рд░реНрдХ (
a_no_key = int_nokey (рдЖ, рдмреАрдмреА),
a_key = int_key (aa_int_key, bb_int_key),
a_a1_no_key = int_char_nokey (рдЖ, рдмреАрдмреА),
a_a1_key = int_char_key(aa_int_char, bb_int_char),
a_a1_key_on = int_char_key_on(aa_int_char, bb_int_char)
)
)

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Rdatatable/data.table/issues/3928?email_source=notifications&email_token=ABRM7MPU64YBK7UNT3O3OYDQ3CTBRA5CNFSM4I4ZPREKYY3PNVWWK3TUL52HS4DFVREXG43VMVB72#JIZGOTNV56H
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABRM7MKSP6LCUJD2HOAG7D3Q3CTRANCNFSM4I4ZPREA
.

рдПрдХ рд▓рдВрдмрд┐рдд рдкреАрдЖрд░ #4370 рд╣реИ рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрд╣ рдХрдо рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ [ рд▓рдЧрд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдордп рдХреЛ 2 рдХреЗ рдХрд╛рд░рдХ рд╕реЗ рдХрдо рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рд╕реБрдзрд╛рд░ рдЙрддрдирд╛ рд╣реА рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ, рдмреЗрд╣рддрд░ рд╕реБрдзрд╛рд░ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдХреЙрд▓рдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдХреЙрд▓рдо рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ fcoalesce рдЬреИрд╕реЗ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рджрд░реНрд╢рдирдХрд╛рд░реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдмрд╛рд░ #4386 рдХрд╛ рднреА рд╡рд┐рд▓рдп рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрддрд┐ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдПред

library(data.table)
aa = data.table(a = seq(1,100), b = rep(0, 100))
bb = data.table(a = seq(1,100), b = rep(1, 100))
setindex(aa, a)
setindex(bb, a)
p = proc.time()[[3L]]
for (i in c(1:1000)) {
  aa[bb, b := i.b, on=.(a)]
}
proc.time()[[3L]]-p
#[1] 1.1

рдорд░реНрдЬрд▓рд┐рд╕реНрдЯ #4370

library(data.table)
aa = data.table(a = seq(1,100), b = rep(0, 100))
bb = data.table(a = seq(1,100), b = rep(1, 100))
setindex(aa, a)
setindex(bb, a)
p = proc.time()[[3L]]
for (i in c(1:1000)) {
  mergelist(list(aa, bb), on="a")
}
proc.time()[[3L]]-p
#[1] 0.696

рд╣рд╛рдп рдЬрд╛рди, рдареАрдХ рд╣реИ рдзрдиреНрдпрд╡рд╛рдж

рдбреЗрдЯрд╛ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рд╕реБрдзрд╛рд░ рдЙрддрдирд╛ рд╣реА рдЫреЛрдЯрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░,
рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ, рдмреЗрд╣рддрд░ рд╕реБрдзрд╛рд░
рдЕрд╕рд▓реА рдореБрджреНрджрд╛ рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рдФрд░ рдХреБрдЫ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ - рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд┐рдЦрд╛ рдерд╛
рдХреЗ рдКрдкрд░

рд╕реЛрдо, 4 рдордИ 2020, 00:33 рдЬрди рдЧреЛрд░реЗрдХреА рдХреЛ, рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдПрдХ рд▓рдВрдмрд┐рдд рдЬрдирд╕рдВрдкрд░реНрдХ рд╣реИ #4370
https://github.com/Rdatatable/data.table/pull/4370 рдЬреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрд╣
рдХрдо рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ [рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд▓рдЧрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ
2 рдХреЗ рдХрд╛рд░рдХ рджреНрд╡рд╛рд░рд╛ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╕рдордпред рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рдбреЗрдЯрд╛, рдЙрддрдирд╛ рдЫреЛрдЯрд╛
рд╕реБрдзрд╛рд░, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ, рдмреЗрд╣рддрд░
рд╕реБрдзрд╛рд░ рдХреАред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдХреЙрд▓рдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдк
рдореВрд▓ рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рдХреЙрд▓рдо рдЬреЛрдбрд╝рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдРрд╕рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ
fcoalesce, рд▓реЗрдХрд┐рди рд╡рд╣ рдкреНрд░рджрд░реНрд╢рдирдХрд╛рд░реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕реЗ #4386 . рдХреЗ рдмрд╛рдж рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрддрд┐ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП
https://github.com/Rdatatable/data.table/pull/4386 рдХреЛ рднреА рдорд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдбреЗрдЯрд╛ред рддрд╛рд▓рд┐рдХрд╛) рдЖ = рдбреЗрдЯрд╛ред рддрд╛рд▓рд┐рдХрд╛ (рдП = рд╕реЗрдХ (1,100), рдмреА = рдкреНрд░рддрд┐рдирд┐рдзрд┐ (0, 100)) рдмреАрдмреА = рдбреЗрдЯрд╛ред рддрд╛рд▓рд┐рдХрд╛ (рдП = рд╕реЗрдХ (1,100), рдмреА = рдкреНрд░рддрд┐рдирд┐рдзрд┐ (1, 100))
рд╕реЗрдЯрдЗрдВрдбреЗрдХреНрд╕ (рдПрдП, рдП)
setindex(bb, a)p = proc.time()[[3L]]for (i in c(1:1000)) {
рдЖ [рдмреАрдмреА, рдмреА: = рдЖрдИрдмреА, рдкрд░ =ред (рдП)]
}
proc.time()[[3L]]-p#[1] 1.1

рдорд░реНрдЬрд▓рд┐рд╕реНрдЯ #4370 https://github.com/Rdatatable/data.table/pull/4370

рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдбреЗрдЯрд╛ред рддрд╛рд▓рд┐рдХрд╛) рдЖ = рдбреЗрдЯрд╛ред рддрд╛рд▓рд┐рдХрд╛ (рдП = рд╕реЗрдХ (1,100), рдмреА = рдкреНрд░рддрд┐рдирд┐рдзрд┐ (0, 100)) рдмреАрдмреА = рдбреЗрдЯрд╛ред рддрд╛рд▓рд┐рдХрд╛ (рдП = рд╕реЗрдХ (1,100), рдмреА = рдкреНрд░рддрд┐рдирд┐рдзрд┐ (1, 100))
рд╕реЗрдЯрдЗрдВрдбреЗрдХреНрд╕ (рдПрдП, рдП)
setindex(bb, a)p = proc.time()[[3L]]for (i in c(1:1000)) {
рдорд░реНрдЬрд▓рд┐рд╕реНрдЯ (рд╕реВрдЪреА (рдПрдП, рдмреАрдмреА), рдСрди = "рдП")
}
proc.time()[[3L]]-p#[1] 0.696

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Rdatatable/data.table/issues/3928#issuecomment-623193573 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABRM7MJR5THRHE3FIXXV3YTRPXWNNANCNFSM4I4ZPREA
.

рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рдХреНрдпрд╛ #4440 (рдХрд▓ рд╡рд┐рд▓рдп) рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдордп @vk111 рджреНрд╡рд╛рд░рд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рдордп рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рд╣рд╛рд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдорджрджрдЧрд╛рд░ рд╣реЛрдЧрд╛ред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╣реИрдВ, рдПрдХ рдФрд░ рд▓рдВрдмрд┐рдд рдкреАрдЖрд░ рд╣реИ рдЬреЛ рдЕрдВрддрддрдГ # 4558 рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред


рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ:

library(data.table)
setDTthreads(2) ## vk111 has 4 cores
aa = data.table(a = seq(1,100), b = rep(0, 100))[,  a1 := as.character(a)]
bb = data.table(a = seq(1,100), b = rep(1, 100))[,  a1 := as.character(a)]
setindex(aa, a); setindex(bb, a)
cat("test1\n")
system.time({
for(i in c(1:1000)) {
  aa[bb, b := i.b, on=.(a, a1)] # test1
}})
cat("test2\n")
system.time({
for(i in c(1:1000)) {
  aa[bb, b := i.b, on=.(a)] # test2
}})

рдФрд░ рдпреЗ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реИрдВ:

docker run -it --rm r-base:3.4.0
install.packages("https://cran.r-project.org/src/contrib/Archive/data.table/data.table_1.10.4-3.tar.gz", repos=NULL)
test1
   user  system elapsed 
  0.949   0.007   0.957 
test2
   user  system elapsed 
  0.864   0.000   0.864 
docker run -it --rm r-base:3.6.1
install.packages("https://cran.r-project.org/src/contrib/Archive/data.table/data.table_1.12.2.tar.gz", repos=NULL)
test1
   user  system elapsed 
  2.598   0.047   1.350 
test2
   user  system elapsed 
  2.092   0.016   1.062 



md5-e82041eef8382e88332d077bb608b87c



docker run -it --rm r-base:3.6.1
install.packages("data.table", repos="https://Rdatatable.gitlab.io/data.table")
test1
   user  system elapsed 
  1.174   0.045   1.219 
test2
   user  system elapsed 
  0.981   0.024   1.004 

рдирдорд╕реНрддреЗ, рдореИрдВ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╣реВрдБ

рд╢реБрдХреНрд░рд╡рд╛рд░, 26 рдЬреВрди 2020, 13:19 рдЬрдирд╡рд░реА рдЧреЛрд░реЗрдХреА рдХреЛ, рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рдХреНрдпрд╛ #4440 https://github.com/Rdatatable/data.table/pull/4440
рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реБрдЖред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдордп рдореБрдЭреЗ рдорд┐рд▓ рд░рд╣рд╛ рд╣реИ
рдпрд╣рд╛рдВ @vk111 . рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдП рдЧрдП рд╕рдордп рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИрдВ
https://github.com/vk111 , рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рд╣рд╛рд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ
рд╕рдВрд╕реНрдХрд░рдг, рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рд╣реЛрдЧрд╛
рдорджрджрдЧрд╛рд░ред
рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ:

рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдбреЗрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛)
setDTthreads(2) ## vk111 рдореЗрдВ 4 coresaa = data.table(a = seq(1,100), b = rep(0, 100))[, a1:= as.character(a)]bb = data.table(a) рд╣реИ = seq(1,100), b = rep(1, 100))[, a1 := as.character(a)]
рд╕реЗрдЯрдЗрдВрдбреЗрдХреНрд╕ (рдПрдП, рдП); рд╕реЗрдЯрдЗрдВрдбреЗрдХреНрд╕ (рдмреАрдмреА, рдП)
рдмрд┐рд▓реНрд▓реА ("test1n")
system.time({for(i in c(1:1000)) {
рдПрдП [рдмреАрдмреА, рдмреА: = рдЖрдИрдмреА, рдкрд░ =ред (рдП, рдП 1)] # рдЯреЗрд╕реНрдЯ 1
}})
рдмрд┐рд▓реНрд▓реА ("test2n")
system.time({for(i in c(1:1000)) {
рдЖ [рдмреАрдмреА, рдмреА: = рдЖрдИрдмреА, рдкрд░ =ред (рдП)] # рдкрд░реАрдХреНрд╖рдг 2
}})

рдФрд░ рдпреЗ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реИрдВ:

рдбреЙрдХрд░ рд░рди-рдЗрдЯ --рдЖрд░рдПрдо рдЖрд░- рдмреЗрд╕: 3.4.0
install.packages("https://cran.r-project.org/src/contrib/Archive/data.table/data.table_1.10.4-3.tar.gz", repos=NULL)
рдЯреЗрд╕реНрдЯ1
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ
0.949 0.007 0.957
рдЯреЗрд╕реНрдЯ2
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ
0.864 0.000 0.864

рдбреЙрдХрд░ рд░рди-рдЗрдЯ --рдЖрд░рдПрдо рдЖрд░- рдмреЗрд╕:3.6.1
install.packages("https://cran.r-project.org/src/contrib/Archive/data.table/data.table_1.12.2.tar.gz", repos=NULL)
рдЯреЗрд╕реНрдЯ1
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ
2.598 0.047 1.350
рдЯреЗрд╕реНрдЯ2
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ
2.092 0.016 1.062

рдбреЙрдХрд░ рд░рди-рдЗрдЯ --рдЖрд░рдПрдо рдЖрд░- рдмреЗрд╕:3.6.1
install.packages("data.table", repos="https://Rdatatable.gitlab.io/data.table")
рдЯреЗрд╕реНрдЯ1
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ
1.174 0.045 1.219
рдЯреЗрд╕реНрдЯ2
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ
0.981 0.024 1.004

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╣реИрдВ, рдПрдХ рдФрд░ рд▓рдВрдмрд┐рдд рдкреАрдЖрд░ рд╣реИ рдЬреЛ рдЕрдВрддрддрдГ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдорджрдж #4558 https://github.com/Rdatatable/data.table/pull/4558 ред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Rdatatable/data.table/issues/3928#issuecomment-650126662 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABRM7MJLU3XRN5YN37ZVLALRYR727ANCNFSM4I4ZPREA
.

@ vk111 рд╣рд╛рдБ, рдареАрдХ рд╡рд╣реА рдЬреЛ рдореИрдВ рдкреВрдЫ рд░рд╣рд╛ рдерд╛ред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд╡рд┐рдВрдбреЛрдЬ рдорд╢реАрди рдкрд░ рдЙрди 3 рд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИ рдпрд╛ рдирд╣реАрдВред

рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд╕рдордЭрд╛ рдерд╛ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдЕрднреА рддрдХ рд╡рд┐рд▓рдп рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ

рд╢реБрдХреНрд░, 26 рдЬреВрди 2020, 20:07 рдЬрдирд╡рд░реА рдЧреЛрд░реЗрдХреА рдХреЛ, рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

@vk111 https://github.com/vk111 рд╣рд╛рдВ, рдареАрдХ рд╡рд╣реА рдЬреЛ рдореИрдВ рдкреВрдЫ рд░рд╣рд╛ рдерд╛ред
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд╡рд┐рдВрдбреЛрдЬ рдорд╢реАрди рдкрд░ рдЙрди 3 рд╡рд┐рдиреНрдпрд╛рд╕реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦреЗрдВ
рдЕрдЧрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Rdatatable/data.table/issues/3928#issuecomment-650320224 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABRM7MMDOCNAWARCCDRSU23RYTPVFANCNFSM4I4ZPREA
.

4440 рдкрд╣рд▓реЗ рд╣реА рдорд░реНрдЬ рд╣реЛ рдЪреБрдХрд╛ рд╣реИ рдФрд░ рд╣рд░ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдорджрдж рдХрд░рддрд╛ рд╣реИред #4558 рдЕрднреА рднреА рд╡рд┐рд▓рдп рдХреЗ рд▓рд┐рдП рд▓рдВрдмрд┐рдд рд╣реИред

@vk111 #4558 рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдорд░реНрдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рд╣рд╛рдп рдЬрд╛рди, рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЖрдкрдХреА рд╕рд▓рд╛рд╣ рд▓реА - #4419
https://github.com/Rdatatable/data.table/issues/4419 рдореЗрд░реЗ рдореБрджреНрджреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд
рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХрд╛ рдпрд╣ рд╕рдЯреАрдХ рдЯреБрдХрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ
рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА рдЗрд╕ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рдмрд╣реБрдд рдорджрдж рдорд┐рд▓реЗрдЧреА
рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд▓реЛрдЧ рдЕрдЧрд░ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдмреЗрд╣рддрд░ рд╣реИ рддреЛ I
рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕реЗ рдорд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
рдЖрдкрдХреЛ рдзрдиреНрдпрд╡рд╛рдж

рдЕрдХреНрдЯреВрдмрд░, 26 рдЕрдкреНрд░реИрд▓ред 2020 . 20:29 рдЬрдирд╡рд░реА, рдЧреЛрд░реЗрдХреА рд╕реВрдЪрдирд╛рдПрдВ @github.com:

4440 https://github.com/Rdatatable/data.table/pull/4440 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ

рд╡рд┐рд▓рдп рдФрд░ рд╣рд░ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдорджрджред #4558
https://github.com/Rdatatable/data.table/pull/4558 рдЕрднреА рднреА рд▓рдВрдмрд┐рдд рд╣реИ
рд╡рд┐рд▓рдп

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Rdatatable/data.table/issues/3928#issuecomment-650330154 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABRM7MIN2P7BXMKG74Z7EKTRYTSIJANCNFSM4I4ZPREA
.

--
рд╕рд╛рджрд░,
рд╡рд╕реАрд▓реА рдХреБрдЬрд╝рдиреЗрддреНрд╕реЛрд╡

@vk111 рдЙрд▓реНрд▓реЗрдЦрд┐рдд рдкреАрдЖрд░ рдкрд╣рд▓реЗ рд╣реА рдорд░реНрдЬ рдХрд┐рдП рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВред рдмрд╛рдд рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИред рд╡реЗ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рдкреАрдЖрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рдереЗ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдЗрд╕рд▓рд┐рдП рд╡реЗ рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред @vk111 https://github.com/Rdatatable/data.table/issues/3928#issuecomment -538681316 рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореИрдВрдиреЗ рдПрдХреНрд╕рдореИрдкрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред

install.packages("https://cran.r-project.org/src/contrib/Archive/data.table/data.table_1.10.4-3.tar.gz", repos=NULL)
install.packages("https://cran.r-project.org/src/contrib/Archive/data.table/data.table_1.12.2.tar.gz", repos=NULL)
install.packages("data.table", repos="https://Rdatatable.gitlab.io/data.table")
library(data.table)
setDTthreads(2L)
set.seed(108)
n2 = 1:366000
n1 = sample(n2, 30000)
d1=data.table(id1=paste0("id",sample(n1)), id2=paste0("id",sample(n1)), v1=n1)
d2=data.table(id1=paste0("id",sample(n2)), id2=paste0("id",sample(n2)), v2=n2)
system.time(d2[d1, v1 := i.v1, on=c("id1","id2")])



md5-e82041eef8382e88332d077bb608b87c



# 3.4.0: 1.10.4-3
   user  system elapsed 
  0.144   0.000   0.144 
# 3.4.0: 1.12.2
   user  system elapsed 
  0.611   0.003   0.451 
# 3.4.0: 1.12.9
   user  system elapsed 
  0.611   0.000   0.452 



md5-e82041eef8382e88332d077bb608b87c



# 4.0.0: 1.10.4-3
   user  system elapsed 
  0.203   0.008   0.211 
# 4.0.0: 1.12.9
   user  system elapsed 
  0.812   0.004   0.644 

рд╡рд░реНрдмреЛрдЬрд╝ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдордп Calculated ad hoc index in 0.611s elapsed (0.769s cpu) рд╡реНрдпрддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ bmerge рд╕реЗ bmerge forderv рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рд╛рдБ рдмрд┐рд▓реНрдХреБрд▓
рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреЛрдИ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ?

рдордВрдЧрд▓рд╡рд╛рд░, 30 рдЬреВрди 2020, 00:45 рдЬрдирд╡рд░реА рдЧреЛрд░реЗрдХреА, рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рдЦрд░рд╛рдм рд░реВрдк рд╕реЗ рдЙрдЬрд╛рдЧрд░ рд╣реЛ рд░рд╣рд╛ рдерд╛
рд╕рдорд╕реНрдпрд╛ред @vk111 https://github.com/vk111 #3928 рдкрд░ рдЖрдзрд╛рд░рд┐рдд (рдЯрд┐рдкреНрдкрдгреА)
https://github.com/Rdatatable/data.table/issues/3928#issuecomment-538681316
рдореИрдВрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдбреЗрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛)
рд╕реЗрдЯ рдбреАрдЯреАрдереНрд░реЗрдбреНрд╕ (2 рдПрд▓)
set.seed(108)n2 = 1:366000n1 = рдирдореВрдирд╛ (n2, 30000)d1=data.table(id1=paste0("id",sample(n1)), id2=paste0("id",sample(n1) ), v1=n1)d2=data.table(id1=paste0("id",sample(n2)), id2=paste0("id",sample(n2)), v2=n2)
system.time(d2[d1, v1:= i.v1, on=c("id1",,"id2")])

3.4.0: 1.10.4-3

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ
0.144 0.000 0.144

3.4.0: 1.12.2

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ
0.611 0.003 0.451

3.4.0: 1.12.9

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ
0.611 0.000 0.452

4.0.0: 1.12.9

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рдгрд╛рд▓реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ
0.812 0.004 0.644

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/Rdatatable/data.table/issues/3928#issuecomment-651408089 ,
рдпрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABRM7MPQHSOEGLXS625BU3TRZEKSBANCNFSM4I4ZPREA
.

рдХреЛрдИ рд╕реБрдзрд╛рд░ рдирд╣реАрдВ, рдпрд╣ рдЕрднреА рднреА рдПрдХ рдореБрджреНрджрд╛ рд╣реИред
рдХреБрдЫ рдЦреБрджрд╛рдИ рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЕрдбрд╝рдЪрди рдпрд╣ рдХреЙрд▓ рд╣реИ
https://github.com/Rdatatable/data.table/blob/ba32f3cba38ec270587e395f6e6c26a80be36be6/src/forder.c#L282
рдЖрдЧреЗ рдмрдврд╝рдирд╛...
рдпрд╣ рд▓реВрдк 60% рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ
https://github.com/Rdatatable/data.table/blob/ba32f3cba38ec270587e395f6e6c26a80be36be6/src/forder.c#L242 -L245
рдФрд░ рд╡реЗ 30% рдХреЗ рд▓рд┐рдП
https://github.com/Rdatatable/data.table/blob/ba32f3cba38ec270587e395f6e6c26a80be36be6/src/forder.c#L252 -L258

рдореИрдВрдиреЗ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдХреНрдпрд╛ рдЖрд░ рдЗрдВрдЯрд░реНрдирд▓реНрд╕ ( CHAR() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдореИрдХреНрд░реЛ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдпрд╣рд╛рдВ рдорджрдж рдорд┐рд▓реЗрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдФрд░ рднреА рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг, рдХреЗрд╡рд▓ forderv рд╕рдордп, рдХреЗрд╡рд▓ R 4.0 рдкрд░

install.packages("https://cran.r-project.org/src/contrib/Archive/data.table/data.table_1.10.4-3.tar.gz", repos=NULL)
library(data.table)
setDTthreads(1L)
set.seed(108)
n2 = 1:366000
d2=data.table(id1=paste0("id",sample(n2)), id2=paste0("id",sample(n2)), v2=n2)
system.time(data.table:::forderv(d2, c("id1","id2")))
install.packages("data.table", repos="https://Rdatatable.gitlab.io/data.table")
library(data.table)
setDTthreads(1L)
set.seed(108)
n2 = 1:366000
d2=data.table(id1=paste0("id",sample(n2)), id2=paste0("id",sample(n2)), v2=n2)
system.time(data.table:::forderv(d2, c("id1","id2")))



md5-e82041eef8382e88332d077bb608b87c



# 4.0.2: 1.10.4-3
   user  system elapsed 
  0.198   0.000   0.198 
# 4.0.2: 1.12.9
   user  system elapsed 
  0.393   0.000   0.392 

рдореИрдВрдиреЗ рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд┐ рдХреНрдпрд╛ R рдЗрдВрдЯрд░реНрдирд▓ (CHAR() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдореИрдХреНрд░реЛ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдпрд╣рд╛рдБ рдорджрдж рдорд┐рд▓реЗрдЧреА, рд▓реЗрдХрд┐рди рдпрд╣ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ R рдЕрдм рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред USE_RINTERNALS рдХреЗ рд╕рд╛рде, INTEGER, REAL рдФрд░ рдореИрдВ CHAR рднреА рдорд╛рдирддрд╛ рд╣реВрдВ, рдЕрднреА рднреА рдЗрдирд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, USE_RINTERNALS рдХреЗ рд▓рд╛рдн (рдЕрд░реНрдерд╛рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрдЬрд╛рдп рдореИрдХреНрд░реЛ) рдХреЛ ALTREP рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП R рдХреЗ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ рдХрд┐ рдпрд╣ рдореИрдХреНрд░реЛ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдЗрдирд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдкреНрд░рддрд┐ рд╕реЗ, рдЗрд╕рд╕реЗ рдлрд░реНрдХ рдкрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдп рдХреА рдЙрд╕ рдЗрдХрд╛рдИ рдХреЗ рдЕрдВрджрд░ R рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдкреБрд░рд╛рдиреЗ рджрд┐рдиреЛрдВ рдореЗрдВ, USE_RINTERNALS рдиреЗ рдЗрд╕реЗ рдПрдХ рдореИрдХреНрд░реЛ рдмрдирд╛ рджрд┐рдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯ рдореЗрдореЛрд░реА рд▓реБрдХрдЕрдк рдерд╛ (рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╣реЗрдбрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдПрдХ рд╕рд░рдгреА рдбреАрд░реЗрдлрд░реЗрдВрд╕) рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рддреЗрдЬрд╝ рдерд╛ред рдпрд╣ рдХрд╛рдо рдХреА рдПрдХ рдмрд╣реБрдд рд╣реА рд╣рд▓реНрдХреА рдЗрдХрд╛рдИ рдереАред рдЗрди рджрд┐рдиреЛрдВ, рдЖрд░ рдХреЗ рдкрд╛рд╕ ALTREP рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╢рд╛рдЦрд╛ рд╣реИ рдФрд░, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╢рд╛рдЦрд╛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗ рд╕рд╛рде, рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдЬреБрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ рдФрд░/рдпрд╛ рдкреНрд░реАрдлреЗрдЪ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЗрди рдЗрдирд▓рд╛рдЗрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдЕрдВрджрд░ R рдХреЗ рдкрд╛рд╕ рдЕрдм рдереЛрдбрд╝рд╛ рдФрд░ рдХреЛрдб рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕рдмреВрдд рдирд╣реАрдВ рд╣реИ, рдмрд╕ рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИред

рдореВрд▓ рдХрд╛рд░рдг cradix_r . рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд╛рдЦрд╛ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
https://github.com/Rdatatable/data.table/blob/76bb569fd7736b5f89471a35357e6a971ae1d424/src/forder.c#L780 -L783
рдФрд░ рдЕрдм рд▓рдВрдмрд╛рдИ 2 рдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╢реЙрд░реНрдЯ-рд╕рд░реНрдХрд┐рдЯ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрдм рдЙрд╕ рд╢рд╛рдЦрд╛ рдХреЛ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдП рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдп рдХреИрд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рд░реНрдп рдмрд╣реБрдд рдмрджрд▓ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

tcederquist picture tcederquist  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pannnda picture pannnda  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

sengoku93 picture sengoku93  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

andschar picture andschar  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

st-pasha picture st-pasha  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ