μλ
νμΈμ, ν
μ€νΈ μ€μ΄μμ΅λλ€
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)
μ λ²μ data.table(R?)
λλ μ£Όλ‘ data.tableμ λ²μ μ λ¬λ € μλ€κ³ μκ°ν©λλ€.
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)
λ€μμ μ€ννμ΅λλ€.
# 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)
κ·Έλ° λ€μμ΄ νλ‘―μ λ§λ€κΈ° μν΄ λ€μμ μννμ΅λλ€.
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)
μ»€λ° μκ°μ λ²€μΉλ§ν¬μ μ§μ μΆκ°νλ €λ©΄
μλ
MichaelChirico, λλ λ λ² μ½μμ΅λλ€
κ·Έλ¬λ 2016λ
λΆν° 2019λ
κΉμ§μ νμλΌμΈμ μ νν 무μμ μλ―Έν©λκΉ? λ°μ΄ν° ν
μ΄λΈ λ²μ μ
λκΉ?
λ²μ λΏλ§ μλλΌ νΉμ 컀λ°. λ΄κ° μΆκ°νλ κ²μ μμ μ’μ μκ°μΈ λ²μ μ κ²½κ³λ₯Ό μΆκ°ν΄ λ³΄κ² μ΅λλ€.
@MichaelChirico κ·νμ κ·Έλνλ λ§€μ° λ©μ Έ 보μ λλ€. λλ½λ κ²μ μ΄μ λν ν΄μμ΄μμ΅λλ€. :) μΆμΈ‘νμ¬ μλ‘μ΄ λ³λ ¬ ν¬λλ κΈΈμ΄ 100μ μ λ ₯μ λν΄ μ΄μ λ³΄λ€ λ립λλ€. μμ§ λ§μ΄ν¬λ‘μ΄μ΄κΈ° λλ¬Έμ μ΄λ IMOκ° μ’μ΅λλ€. λ¬Όλ‘ μ€λ²ν€λλ₯Ό μ€μ΄λ κ²μ κ°μΉκ° μμ§λ§ κ°μ₯ μΌλ°μ μΈ μ¬μ© μλ리μ€μμ μ°μ μμλ 리μμ€λ₯Ό μ€μ΄λ κ²μ΄μ΄μΌ ν©λλ€. κΈΈμ΄ 100 μ λ ₯μ λν΄ 10000λ² λ°λ³΅νλ κ²μ νμ€ν κ·Έ μ€ νλκ° μλλλ€.
κ·Έκ²μ 1.12.0 NEWSλ₯Ό λ³΄κ³ λλ μΆμΈ‘νλ€. λ¨μΌ μ€λ λλ₯Ό λ€μ μ€ννλ €κ³ ν©λλ€.
@jangorecki , κ°λ¨ν μνμ μννλ©΄ μμ² λ§μ΄ν¬λ‘μ΄, μ¦ λ°λ¦¬μ΄μ
λλ€.
μ΄ ν
μ€νΈμ μκ°μ 40,000νμ΄ μλ 7-8λ°° ν
μ΄λΈμ μ‘°μΈνλ νμ¬ νλ‘μ νΈμμ΅λλ€.
18μ΄κ° 걸리기 μ , 40μ΄ νμ
λ΄ ν
μ€νΈμλ λ¬Έμ ν€λ ν¬ν¨λμ΄ μμ΅λλ€.
3.6+1.12λ₯Ό μ€μΉν λ€μ 3.4+1.10μΌλ‘ λ‘€λ°±νμ΅λλ€.
λλ μ΄κ²μ΄ μ μμ μΈ μν©μ΄ μλλΌκ³ μκ°νμ¬μ΄ λ¬Έμ κ° μ¬κΈ°μ μμ΅λλ€.
λ€, κ·Έλνλ μ λ§ κ΅μ₯ν©λλ€. μ°λ¦¬λ μ΄κ²μ λ λ§μ΄ νκ³ μλνν΄μΌ ν©λλ€.
κ·Έλ¬λ μλ λ³΄κ³ μλ R 3.4μ R 3.6μ λΉκ΅νλλ° R 3.5κ° μ€κ°μ μμ΅λλ€. μ°λ¦¬λ R 3.5κ° ALTREPμ REAL(), INTEGER() 맀ν¬λ‘μμ (μ½κ° λ 무거μ΄) ν¨μλ‘ λ³κ²½μ ν΅ν΄ data.tableμ μν₯μ λ―Έμ³€λ€λ κ²μ μκ³ μμ΅λλ€.
@vk111 μ§κΈ CRANμμ v1.12.4λ‘ ν μ€νΈλ₯Ό λ€μ μ€νν΄ μ£Όμκ² μ΅λκΉ? λ λμ? μ°λ¦¬λ R 3.5+μ λμ²νκΈ° μν΄ λ£¨ν μΈλΆμμ R APIλ₯Ό κ°μ Έμμ΅λλ€. λ€μ λ¨κ³λ‘ v1.12.4λ₯Ό μ°Ύλ λ°©λ²μ μλ κ²μ΄ μ’μ΅λλ€. λΉμ μ λν λΉμ μ κΈ°κ³μ λν λ λ§μ μ 보λ₯Ό ν¬ν¨ν μ μμ΅λκΉ? μ: μ΄μ 체μ , RAM λ° CPU μ.
@matt ν κ±°μΌ
μλ νμΈμ @mattdowle ,
Iveλ 1.12.4(+R 3.6.1)λ‘ μ
λ°μ΄νΈνμ΅λλ€. κΈ°λ³Έμ μΌλ‘ λ¨μ ν
μ€νΈμ λ΄ κΈ°λ₯μ λν΄ λμΌν μ«μκ° μμ΅λλ€.
μ¬κΈ°μλ μΈλ±μ± μμ΄ λ¬Έμκ° μλ μ‘°μΈλ§ λ²€μΉλ§ν¬λ‘ κ³ λ €ν κ²μ
λλ€.
λ¨μ ν
μ€νΈ(첫 λ²μ§Έ κ²μλ¬Όμμ μΈκΈν λλ‘)
3.6.1: μΈλ±μ€ μμ΄ 6.87μ΄
3.4.0: 3.02μ΄(μΈλ±μ€ μμ)
νλ‘μ νΈμ λ΄ κΈ°λ₯μ λμΌνκ² μ μ§λ©λλ€: 20μ΄ λ 40μ΄
~14κ°μ dt μ‘°μΈμΌλ‘λ§ κ΅¬μ±λ©λλ€.
2κ°μ ν
μ΄λΈ 30,000ν(dt1) λ° 366,000ν(dt2)
κ°κ° 15μ΄
ν€λ 2κ°μ λ¬Έμμ 1κ°μ μ«μμ
λλ€.
μ‘°μΈ μ€μ 7κ°μ νλ(dt1μμ dt2κΉμ§)λ₯Ό ν λΉνμ΅λλ€.
λ΄ PC:
μΉλ¦¬ 10 64λΉνΈ
AMD A8 2.2GHz
8GB RAM
cmd: wmic cpu get NumberOfCores, NumberOfLogicalProcessors/ νμ: λͺ©λ‘
μ½μ΄ μ=4
NumberOfLogicalProcessors=4
λΆμν΄μ£Όμ μ κ°μ¬ν©λλ€
μλ @mattdowle κ·Έλμ λΉμ μ μ΄κ²μ κ³ λ €νκ³ μμ΅λκΉ?
λ°©κΈ λ€μ μ€νν git bisect
μ λ°λ₯΄λ©΄ μ΄ μ»€λ°μ μλ μ νμ λν "μ μ£"μ΄λ©° Mattκ° λ£¨νΈλ₯Ό νμ
νλ λ° λμμ΄ λ μ μκΈ°λ₯Ό λ°λλλ€. 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
컀λ°μ μ½ 0.7μ΄μμ΅λλ€.
μλ
νμΈμ Michael, κ°μ¬ν©λλ€. νμ§λ§ νΉν μ±λ₯μ΄ ν¬κ² λ¨μ΄μ‘μ΅λλ€.
첫 λ²μ§Έ κ²μλ¬Όμμ λ¨μ ν
μ€νΈμ ν¨κ» μ 곡λ λ¬Έμ ν€μ λν΄
μ΄μ¨λ λ¬Έμ κ° ν΄κ²°λμλμ§ Mattμ νμΈμ κΈ°λ€λ €μΌ νλ€κ³ μκ°ν©λλ€.
μ λ²μ μ΄λ μλλ
2019λ
12μ 26μΌ λͺ©μμΌ 15:02, Michael Chirico [email protected]
μΌλ€:
λ°©κΈ λ€μ μ€νν git bisectμ λ°λ₯΄λ©΄ μ΄ μ»€λ°μ
μ²μ²ν, μνλ©΄ Mattκ° λ£¨νΈλ₯Ό κ³ μ νλ λ° λμμ΄ λ μ μμ΅λλ€. κ·Έκ²μ
forderμ κ΄λ ¨λ κ²μ μ°λ¦¬κ° κ·Έκ²μ κ³ μ μμΌ°λ€λ κ²μ μλμ μΌλ‘ νμ νκ² λ§λλλ€.
λ°λ₯΄κ².e59ba14
https://github.com/Rdatatable/data.table/commit/e59ba149f21bb35098ed0b527505d5ed6c5cb0dbλ μ ννκ²:
run_join_time.sh
R CMD μ€μΉ . && Rμ€ν¬λ¦½νΈ time_join.R
time_join.R
λΌμ΄λΈλ¬λ¦¬(data.table)
λΌμ΄λΈλ¬λ¦¬(λ§μ΄ν¬λ‘λ²€μΉλ§ν¬)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 := ib, on=.(a)])$time/1e6)
λ§μ€ν°/HEADμμ λ€μ λ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©ν©λλ€.
μμ μ²΄ν¬ μμ 1.12.0
μμ μ΄λ±λΆ μμ
μμ μ΄λ±λΆ λμ
μμ μ΄λ±λΆ μ’μ 1.11.8κ·Έλ° λ€μ κ° λ°λ³΅μμ sh run_join_time.shλ₯Ό μ€ννκ³ κ²°κ³Όλ₯Ό νμΈν©λλ€. κ·Έλ§νΌ
λμ 컀λ°μ λ΄ μ»΄ν¨ν°μμ λ°λ³΅λΉ λλ΅ 0.9μ΄κ° κ±Έλ Έμ΅λλ€.
μ’μ μ»€λ° μ½ .7.β
λΉμ μ΄ μΈκΈλμκΈ° λλ¬Έμ μ΄κ²μ λ°λ κ²μ λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈνμΈμ.
https://github.com/Rdatatable/data.table/issues/3928?email_source=notifications&email_token=ABRM7MJQITNUZDNYV7NTIX3Q2S2ORA5CNFSM4I4ZPREKYY6HTRKY6EPNVWWK3TUL52HS4DFVREXG43VMVBW63
λλ ꡬλ μ·¨μ
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
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)
)
)
μλ
νμΈμ Cole, μ, setkeyμ λν΄ μκ³ μμ΅λλ€. μμμ κ°λ¨ν μ€λͺ
μ μ 곡νμ΅λλ€.
λ΄ νλ‘μ νΈμ 1000κ° μ‘°μΈμ λͺ©μ μ΄ μμ΅λλ€. 10-20κ° μ λ μμ΅λλ€.
μ‘°μΈνκ³ λ¬Έμ λ λ΄ λ¬Έμμ΄μ΄ λ§€μ° λμ μ΄κ³
20λ² setkeyμ 20λ²μ²λΌ μ‘°μΈνκΈ° μ μ λ§€λ² setkeyλ₯Ό λ§λ€μ΄μΌ ν©λλ€.
μκ°μ΄ κ²°ν©νλ―λ‘ μκ°μ μ΄λμ 2λ°° λ―Έλ§μ
λλ€.
μ΄ μν©μ λν μΌλ°μ μΈ ν΄κ²° λ°©λ²μΌλ‘ μ μ λμ 3.4.0μ μ¬μ©ν©λλ€.
νΉν λ€μκ³Ό κ°μ κ²½μ° μ λ²μ μμ μμ νλ κ²μ΄ ν° λ¬Έμ λ μλ κ²μ
λλ€.
μ μ£ μ»€λ°μ΄ λ°κ²¬λμμ΅λλ€
κ·Έλ°λ° μ¬κ³Όμ μ¬κ³Όλ₯Ό λΉκ΅νλ©΄ 3.4(1.10)κ° λ κ²μ΄λΌκ³ μκ°ν©λλ€.
setkeyμ λμΌν λ¨μ ν
μ€νΈλ₯Ό μ¬μ©νλ κ²½μ° 3.6(1.12)λ³΄λ€ μ¬μ ν λΉ λ¦
λλ€.
λ λ²μ λͺ¨λ
μ¦κ±°μ΄ ν΄μΌ 보λ΄μΈμ
2019λ 12μ 29μΌ μΌμμΌ 14:48 Cole Miller, [email protected] μ΄:
@vk111 https://github.com/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)]μλ©΄ κ²½λ ¨()
for(i in c(1:1000)) {
aa[bb, b := ib, on=.(a, a1)] # ν€κ° μλ test1
}
λͺ©μ°¨()4μ΄ κ²½κ³Ό
μλ©΄ κ²½λ ¨()
μΈνΈν€(aa, a, a1)
μΈνΈν€(bb, a, a1)for(i in c(1:1000)) {
aa[bb, b := ib] # ν€κ° μλ test2
}
λͺ©μ°¨()1.46μ΄ κ²½κ³Ό
[μ΄λ―Έμ§: μ΄λ―Έμ§]
https://user-images.githubusercontent.com/57992489/71557665-126d7880-2a17-11ea-8664-21a10deb47ca.pngλΌμ΄λΈλ¬λ¦¬(λ§μ΄ν¬λ‘λ²€μΉλ§ν¬)
λΌμ΄λΈλ¬λ¦¬(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 = 볡μ¬(aa)
bb_nokey = 볡μ¬(bb)μλ©΄ κ²½λ ¨()
aa_int_key = setkey(볡μ¬(aa), a)
bb_int_key = setkey(볡μ¬(bb), a)
λͺ©μ°¨()μλ©΄ κ²½λ ¨()
aa_int_char = setkey(볡μ¬(aa), a, a1)
bb_int_char = setkey(볡μ¬(bb), a, a1)
λͺ©μ°¨()
int_nokey = ν¨μ(dt1, dt2){
dt1[dt2, b := ib, on=.(a)]
}int_key = ν¨μ(dt1, dt2){
dt1[dt2, b := ib]
}int_char_nokey = ν¨μ(dt1, dt2){
dt1[dt2, b := ib, on=.(a, a1)]
}int_char_key = ν¨μ(dt1, dt2){
dt1[dt2, b := ib]
}int_char_key_on = ν¨μ(dt1, dt2){
dt1[dt2, b := ib, on=.(a, a1)]
}μμ κ·Έλ¦Ό(
λ§μ΄ν¬λ‘ λ²€μΉλ§ν¬(
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)
)
)β
λΉμ μ΄ μΈκΈλμκΈ° λλ¬Έμ μ΄κ²μ λ°λ κ²μ λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈνμΈμ.
https://github.com/Rdatatable/data.table/issues/3928?email_source=notifications&email_token=ABRM7MPU64YBK7UNT3O3OYDQ3CTBRA5CNFSM4I4ZPREKYY3PNVWWK3TUL52HS4DFVEXG43VMVBW
λλ ꡬλ μ·¨μ
https://github.com/notifications/unsubscribe-auth/ABRM7MKSP6LCUJD2HOAG7D3Q3CTBRANCNFSM4I4ZPREA
.
κ΄λ ¨νμ¬ λ³΄λ₯ μ€μΈ PR #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
μλ Jan, μμμ΄ κ³ λ§μ
λ°μ΄ν°κ° ν΄μλ‘ κ°μ μ μμ§λ§ λ°λ©΄μ
λ λ§μ λ°λ³΅, λ λμ κ°μ
μ€μ λ¬Έμ λ λΉ λ°μ΄ν° λ° λͺ κ°μ§ λ°λ³΅κ³Ό κ΄λ ¨μ΄ μμ΅λλ€.
~ μμ
2020λ 5μ 4μΌ μμμΌ, 00:33 Jan Gorecki, [email protected] μ΄:
보λ₯ μ€μΈ PR #4370μ΄ μμ΅λλ€.
https://github.com/Rdatatable/data.table/pull/4370 κ΄λ ¨λμ΄ μμ΅λλ€. κ·Έκ²
μΌλ°μ μΌλ‘ λΆκ³Όνλ λ μ μ μ€λ²ν€λλ‘ μ‘°μΈμ λ§λ€ μ μμ΅λλ€. κ·Έκ²μ κ°μ
2μ μμλ‘ μμ μ νμ΄λ°. λ°μ΄ν°κ° ν΄μλ‘ μμμ§λλ€.
κ°μ λμ§λ§ λ°λ©΄μ λ°λ³΅μ΄ λ§μμλ‘ λ μ’μ΅λλ€.
κ°μ . μ‘°μΈ μ€μλ μ΄μ μ λ°μ΄νΈν μ μλ λ°©λ²μ΄ μμ΅λλ€. λ
κΈ°λ³Έμ μΌλ‘ μ‘°μΈ μ€μ μ΄μ μΆκ°ν λ€μ λ€μκ³Ό κ°μ κ²μ μ¬μ©ν΄μΌ ν©λλ€.
fcoalesceμ§λ§ μ±λ₯μ΄ μ’μμΌ ν©λλ€.
ν λ² λ μλλ₯Ό μ¬λ €μΌ ν©λλ€. #4386
https://github.com/Rdatatable/data.table/pull/4386 λ λ³ν©λ©λλ€.λΌμ΄λΈλ¬λ¦¬(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, a)
setindex(bb, a)p = proc.time()[[3L]]for (i in c(1:1000)) {
aa[bb, b := ib, on=.(a)]
}
proc.time()[[3L]]-p#[1] 1.1λ³ν© λͺ©λ‘ #4370 https://github.com/Rdatatable/data.table/pull/4370
λΌμ΄λΈλ¬λ¦¬(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, a)
setindex(bb, a)p = proc.time()[[3L]]for (i in c(1:1000)) {
λ³ν© λͺ©λ‘(λͺ©λ‘(aa, bb), on="a")
}
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 μ΄ λ³΄κ³ ν νμ΄λ°κ³Ό μλΉν λ€λ₯΄μ§λ§ μ΅μ κ°λ° λ²μ μ ν
μ€νΈν μ μλ€λ©΄ λμμ΄ λ μν¬νλ‘μ μ΄λ€ μ°¨μ΄κ° μλμ§ νμΈνμμμ€.
Windowsλ₯Ό μ¬μ© μ€μ΄λ―λ‘ κ²°κ΅ #4558μ λμμ΄ λ μ μλ λ λ€λ₯Έ 보λ₯ μ€μΈ PRμ΄ μμ΅λλ€.
μ΄κ²μ κ° νκ²½μμ μ€ννλ κ³΅ν΅ μ€ν¬λ¦½νΈμ λλ€.
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
μλ νμΈμ, μ λ Windowsμ μμ΅λλ€.
2020λ 6μ 26μΌ κΈμμΌ 13:19 Jan Gorecki, μλ¦Ό @github.comμ΄ μμ±νμ΅λλ€.
#4440 https://github.com/Rdatatable/data.table/pull/4440 μΈμ§ νμΈνμ΅λλ€.
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νμ§λ§ ν΄κ²°λμ§ μμ κ² κ°μ΅λλ€. λΉλ‘ λ΄κ° μ»λ νμ΄λ°
@vk111μ΄ λ³΄κ³ ν νμ΄λ°κ³Ό μλΉν λ€λ¦ λλ€.
https://github.com/vk111 , κ·Έλμ μ΅κ·Ό κ°λ°μ ν μ€νΈν μ μλ€λ©΄
λ²μ μ νμΈνκ³ μν¬νλ‘μ μ΄λ€ μ°¨μ΄κ° μλμ§ νμΈν©λλ€.
λμμ΄λλ.
μ΄κ²μ κ° νκ²½μμ μ€ννλ κ³΅ν΅ μ€ν¬λ¦½νΈμ λλ€.λΌμ΄λΈλ¬λ¦¬(data.table)
setDTthreads(2) ## vk111μλ 4κ°μ μ½μ΄κ° μμ΅λλ€.saa = 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)]
μΈνΈ μΈλ±μ€(aa, a); μΈνΈ μΈλ±μ€(bb, a)
κ³ μμ΄("test1n")
system.time({for(i in c(1:1000)) {
aa[bb, b := ib, on=.(a, a1)] # test1
}})
κ³ μμ΄("test2n")
system.time({for(i in c(1:1000)) {
aa[bb, b := ib, on=.(a)] # test2
}})λ€μμ νκ²½μ λλ€.
λ컀 μ€ν -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)
ν μ€νΈ1
μ¬μ©μ μμ€ν κ²½κ³Ό
0.949 0.007 0.957
ν μ€νΈ2
μ¬μ©μ μμ€ν κ²½κ³Ό
0.864 0.000 0.864λ컀 μ€ν -it --rm r- λ² μ΄μ€: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λ컀 μ€ν -it --rm r- λ² μ΄μ€: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.004Windowsλ₯Ό μ¬μ© μ€μ΄λ―λ‘ κ²°κ΅μλ 보λ₯ μ€μΈ λ λ€λ₯Έ PRμ΄ μμ΅λλ€.
λμλ§ #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 μ, μ νν μ κ° μ§λ¬Έν λ΄μ©μ λλ€. Windows μμ€ν μμ ν΄λΉ 3κ°μ ꡬμ±μ νμΈνκ³ μ§ν μν©μ΄ μλμ§ νμΈν μ μλ€λ©΄.
κ·Έλ¬λ Windowsμ© prμ΄ μμ§ λ³ν©λμ§ μμ κ²μΌλ‘ μκ³ μμ΅λλ€.
2020λ 6μ 26μΌ κΈμμΌ 20:07 Jan Gorecki, μλ¦Ό @github.com μμ±:
@vk111 https://github.com/vk111 μ, μ νν μ κ° μ§λ¬Έν λ΄μ©μ λλ€.
Windows μμ€ν μμ ν΄λΉ 3κ°μ ꡬμ±μ νμΈν μ μλ€λ©΄
λΉμ μ μν μ§μ μ΄ μλ€λ©΄.β
λΉμ μ΄ μΈκΈλμκΈ° λλ¬Έμ μ΄κ²μ λ°λ κ²μ λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈνμΈμ.
https://github.com/Rdatatable/data.table/issues/3928#issuecomment-650320224 ,
λλ ꡬλ μ·¨μ
https://github.com/notifications/unsubscribe-auth/ABRM7MMDOCNAWARCCDRSU23RYTPVFANCNFSM4I4ZPREA
.
@vk111 #4558λ μ΄λ―Έ λ³ν©λμμ΅λλ€.
μλ
νμΈμ Jan, μ΅κ·Όμ μ‘°μΈμ λ°μμ΅λλ€ - #4419
λ΄ λ¬Έμ μ κ΄λ ¨λ https://github.com/Rdatatable/data.table/issues/4419
κ·Έλμ λλ λ¬Έμκ° κ²°ν© λμ΄ μ νν μ½λλ₯Ό κ°μ§κ³ μμ§ μμ΅λλ€.
νμ§λ§ μ΄μ¨λ μ΄ κ°μ μ¬νμ λν΄ κ°μ¬λ립λλ€. λ§μ λμμ΄ λ κ²μ΄λΌκ³ νμ ν©λλ€.
λ―Έλμ μ¬λλ€μ κ·Έκ²μ΄ λ λμ μ±λ₯μ κ°μ§κ³ μλ€κ³ λ―Ώλλ€λ©΄ λ보λ€
κ·Έλ₯ λ³ν©ν΄μΌ ν κ² κ°μμ
κ°μ¬ν©λλ€
ΠΏΡ, 26 ΠΈΡΠ½. 2020λ Π² 20:29, μ κ³ λ ν€ μλ¦Ό @github.com :
4440 https://github.com/Rdatatable/data.table/pull/4440 μ μ΄λ―Έ
λͺ¨λ OSμ λν λ³ν© λ° λμλ§. #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 μΈκΈν PRμ μ΄λ―Έ λ³ν©λμμ΅λλ€. λ¬Έμ λ μ΄ λ¬Έμ κ° ν΄κ²°λμκ±°λ μ΅μν κ°μ λμλμ§ μ¬λΆλ₯Ό μλ κ²μ λλ€. λ³ν©λ PRμ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ €κ³ μλνμ§ μμμ§λ§ κ΄λ ¨μ΄ μμΌλ―λ‘ λμμ΄ λ μ μμ΅λλ€.
μ²μμ λ³΄κ³ λ μ΅μνμ μκ° λ¬Έμ λ₯Ό μ λλ‘ λλ¬λ΄μ§ μμμ΅λλ€. @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
verboseλ bmerge
forderv
μ λν νΈμΆμΈ Calculated ad hoc index in 0.611s elapsed (0.769s cpu)
μ λλΆλΆμ μκ°μ μλΉνμμ 보μ¬μ€λλ€.
μ, μ νν
κ·Έλ°λ° μ΄ ν
μ€νΈμμ κ°μ μ΄ μλ κ² κ°μ΅λκΉ?
2020λ 6μ 30μΌ νμμΌ 00:45 Jan Gorecki, μλ¦Ό @github.com μμ±:
μ²μμ λ³΄κ³ λ μ΅μνμ μμ κ° μ λλ‘ λ ΈμΆλμ§ μλ κ²½μ°κ° λ°μν©λλ€.
λ¬Έμ . @vk111 https://github.com/vk111 #3928(λκΈ) κΈ°μ€
https://github.com/Rdatatable/data.table/issues/3928#issuecomment-538681316
μ¬κΈ°μ λ¬Έμ κ° μμμ λΆλͺ ν 보μ¬μ£Όλ μλ₯Ό ꡬμ±νμ΅λλ€.λΌμ΄λΈλ¬λ¦¬(data.table)
setDTthreads(2L)
set.seed(108)n2 = 1:366000n1 = 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")])3.4.0: 1.10.4-3
μ¬μ©μ μμ€ν κ²½κ³Ό
0.144 0.000 0.1443.4.0: 1.12.2
μ¬μ©μ μμ€ν κ²½κ³Ό
0.611 0.003 0.4513.4.0: 1.12.9
μ¬μ©μ μμ€ν κ²½κ³Ό
0.611 0.000 0.4524.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
R λ΄λΆ(ν¨μκ° μλ 맀ν¬λ‘ 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λ μ¬μ ν μΈλΌμΈ ν¨μλΌκ³ κ°μ ν©λλ€. λ€μ λ§ν΄μ, ALTREPλ₯Ό νμ©νκΈ° μν΄ μ΅μ λ²μ μ Rμμ USE_RINTERNALSμ μ΄μ (μ¦, κΈ°λ₯ λμ 맀ν¬λ‘)μ΄ μ κ±°λμμ΅λλ€. λλ κ·Έκ²μ΄ 맀ν¬λ‘μΈμ§, ν¨μμΈμ§, μΈλΌμΈ ν¨μμΈμ§ κ·Έ μμ²΄λ‘ μ°¨μ΄λ₯Ό λ§λ λ€κ³ μκ°νμ§ μμ΅λλ€. μμ λ¨μ λ΄μμ Rμ΄ μννλ μμ μ λλ€. μμ μλ USE_RINTERNALSκ° μ΄λ₯Ό 맀ν¬λ‘λ‘ λ§λ€κ³ μ§μ μ μΈ λ©λͺ¨λ¦¬ μ‘°ν(벑ν°μ ν€λλ₯Ό κ³ λ €ν λ°°μ΄ μμ°Έμ‘°)μκΈ° λλ¬Έμ μλκ° λ λΉ¨λμ΅λλ€. κ·Έκ²μ λ§€μ° κ°λ²Όμ΄ μμ λ¨μμμ΅λλ€. μμ¦ Rμλ ALTREPλ₯Ό κ²μ¬ν λΆκΈ°κ° νλ μ΄μ μμΌλ©° λΆκΈ° μμΈ‘μ μ¬μ©νλλΌλ μΆκ° μμ μ΄ μΆκ°λκ±°λ ν리νμΉλ₯Ό λ°©μ§ν©λλ€. λ€μ λ§ν΄, Rμ μ΄μ μ΄λ¬ν μΈλΌμΈ ν¨μ λ΄λΆμ μ½λκ° μ‘°κΈ λ λ§μ΅λλ€. λλ λ²€μΉλ§ν¬ μ¦κ±°κ° μκ³ λ¨μ§ κ·Έκ²μ 보λ κ²μ κΈ°μ΄ν μ΄λ‘ μΌ λΏμ λλ€.
κ·Όλ³Έ μμΈμ cradix_r
μμ λ€μ λΆκΈ°λ₯Ό μ κ±°νλ κ²μΌ μ μμ΅λλ€.
https://github.com/Rdatatable/data.table/blob/76bb569fd7736b5f89471a35357e6a971ae1d424/src/forder.c#L780 -L783
μ΄μ κΈΈμ΄ 2μ μ
λ ₯μλ λ¨λ½μ΄ μμ΅λλ€.
κΈ°λ₯μ΄ μλ λ°©μ μΈ‘λ©΄μμ λ§μ΄ λ³κ²½λμκΈ° λλ¬Έμ μ§κΈ ν΄λΉ λΆκΈ°λ₯Ό λ°°μΉνλ λ°©λ²μ΄ λͺ
ννμ§ μμ΅λλ€.