2014-10-10 1 views
3

data.table의 이유는 새 행을 업데이트 (= rbind) 할 때 xts보다 거의 6 배 더 느린 이유는 무엇입니까? 자동으로 색인을 생성하는 xts :: rbind보다 느린 data.table의 rbind + setkey?

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 

(XTS는 달리) data.table 것조차 배기 메모리 할당

내 컴퓨터에서 나는> 15.

일반적인 프로그래밍 사용 사례는 임시 시뮬레이션을 실행하고 중간 측정 값을 결과 테이블에 수집하려는 경우입니다. 나중에 결과를 요약하려고합니다.

+0

여기서 'blotter'를 (를) 설치할 수 있습니까? – Arun

+0

@Arun 아, 죄송합니다,'blotter' 대신에'quantmod' - 그냥'quantmod :: getSymbols'를 통해 빠르게 데이터를 얻는 것입니다. 나는 그 질문을 편집했다. –

+0

Beasterfield가 보여준 것처럼 처음부터 수집하고 + setkey를 마지막으로 바인딩 할 수 없습니까? 나는'rbind.xts'가 C로 구현되어 있고, 다시 색인화가 같은 단계에서 수행된다면 더 효율적으로 처리한다는 것을 알 수 있습니다. DT에서는 먼저 바인딩 한 다음 다시 배열해야합니다. 이런 식으로 사용하지 않는 것이 좋습니다. 이 방법으로 업데이트해야합니까? – Arun

답변

0

크게 런타임을 강화해야

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

rbindlist

을보십시오.

+0

시뮬레이션의 각 단계는 'DT'의 각 중간 요약에서 피드백을 수집해야하므로 'rbindlist (rep (list (DT), 10))'는 DT = setkey (rbindlist (DT, DT)), Date)' –

+0

또한'rbindlist'로 3 번째 테스트를 추가 했으므로 그 개선은 극히 미미합니다 –

관련 문제