rbind + setkey в data.table по-бавно от xts::rbind, което автоматично индексира?

Каква е причината data.table да е почти 6 пъти по-бавен от xts при актуализиране (=rbind) на нови редове?

library(quantmod); library(xts); library(data.table)
XTS = getSymbols("AAPL", from="2000-01-01", env = NULL)

# make corresponding `data.table`:
DT <- as.data.table(as.data.frame(XTS))
DT[, Date:=index(XTS)]
setkey(DT,Date)
setcolorder(DT,c("Date",names(XTS)))

# Note: rerun the above before running each test.
system.time(for(i in 1:10) XTS = rbind(XTS, XTS)) # reindexing is automatic
#    user  system elapsed 
#    0.15    0.03    0.47 
system.time(for(i in 1:10) DT = setkey(rbind(DT, DT), Date)) # need to manually reset key
#    user  system elapsed 
#    0.64    0.02    2.30 
system.time(for(i in 1:10) DT = setkey(rbindlist(list(DT, DT)), Date)) # ditto
#    user  system elapsed 
#    0.60    0.02    2.20 

data.table (за разлика от xts) дори ще изчерпи разпределението на паметта за i>15 на моя компютър.

Обичайният случай на използване при програмиране е, когато изпълнявате времева симулация и искате да съберете междинни измервания в таблица с резултати, която по-късно искате да обобщите.


person Daniel Krizian    schedule 10.10.2014    source източник
comment
Откъде мога да инсталирам blotter?   -  person Arun    schedule 10.10.2014
comment
@Arun ах, съжалявам, quantmod вместо blotter - това е само за бързо получаване на данни чрез quantmod::getSymbols. Редактирах въпроса.   -  person Daniel Krizian    schedule 10.10.2014
comment
Не можете ли първо да ги съберете и накрая да свържете + setkey веднъж, както показа Beasterfield? Виждам, че rbind.xts е имплементирано в C и ако повторното индексиране се извършва в същата стъпка, то го прави по-ефективно. В DT първо трябва да обвържем, след това да го пренаредим. Бих се опитал да избегна използването му по този начин. Трябва ли да актуализирате по този начин?   -  person Arun    schedule 10.10.2014
comment
@Arun, за съжаление, симулацията трябва да събира обратна връзка от обобщения DT на всяка стъпка и да се препараметризира. Това е зависима от пътя симулация по дизайн, следващата стъпка зависи от предишната стъпка   -  person Daniel Krizian    schedule 10.10.2014
comment
Предполагам, че след това rbindlist трябва да приложи допълнителен аргумент key, за да върне резултатите вече в сортирания ред. Не съм сигурен как иначе можете да получите същата производителност като xts::rbind   -  person Arun    schedule 10.10.2014
comment
@Arun Съгласен съм, че това изисква реализация на C, xts е добър показател за това. Може би искане за функция?   -  person Daniel Krizian    schedule 10.10.2014
comment
Да, ако можете да подадете такъв (с връзка към тази публикация), би било страхотно! Може би заглавието rbind + setkey в data.table е по-бавно от xts::rbind, което автоматично индексира, е по-добро?   -  person Arun    schedule 10.10.2014


Отговори (1)


Опитвам

rbindlist( rep( list(DT), 10 ))

rbindlist трябва значително да увеличи времето ви за изпълнение.

person Beasterfield    schedule 10.10.2014
comment
Моля, обърнете внимание, че всяка стъпка от симулацията трябва да събере обратна връзка от всяко междинно обобщение на DT, следователно rbindlist( rep( list(DT), 10 )) не е същото като DT = setkey(rbindlist(list(DT, DT)), Date) - person Daniel Krizian; 10.10.2014
comment
Добавих и трети тест с rbindlist и подобрението е незначително - person Daniel Krizian; 10.10.2014