대용량 - r fread 사용법



R-많은 수의 data.table 객체를 만드는 속도가 느립니다. (1)

물론 data.table 객체의 주된 목적은 빠른 서브 data.table / 그룹핑 등을 허용한다는 것입니다. 하나의 큰 data.table 을 갖는 것이 훨씬 더 합리적입니다. (매우 효율적으로) 많은 가능한 작은) data.table 객체.

즉, 나는 최근에 많은 data.table 객체를 인스턴스화하는 스크립트를 data.table 메모리 내 data.table's 수가 증가함에 따라 퍼포먼스가 감소한다는 것을 알게되었습니다.

다음은 내가 말하는 의미의 예입니다.

n <- 10000
# create a list containing 10k data.frame's
system.time(lotsofDFs <- lapply(1:n,FUN=function(i){ data.frame(A=1:10,B=1:10,ID=i)}),gcFirst=T)
#   user  system elapsed 
#   2.24    0.00    2.23 
# create a list containing 10k data.table's
system.time(lotsofDTs <- lapply(1:n,FUN=function(i){ data.table(A=1:10,B=1:10,ID=i)}),gcFirst=T)
#   user  system elapsed 
#   5.49    0.01    5.53 
n <- 80000
# create a list containing 80k data.frame's
system.time(lotsofDFs <- lapply(1:n,FUN=function(i){ data.frame(A=1:10,B=1:10,ID=i)}),gcFirst=T)
#   user   system elapsed
#   19.42    0.01   19.53
# create a list containing 80k data.table's
system.time(lotsofDTs <- lapply(1:n,FUN=function(i){ data.table(A=1:10,B=1:10,ID=i)}),gcFirst=T)
#   user    system elapsed
#   147.03    0.10  147.41

data.frame's 생성 시간은 생성 된 data.table data.frame's 수에 따라 선형 적으로 증가하지만 data.table 복잡성은 선형 이상의 것 같습니다.

예상 되나요?

이 것이 메모리 내장 테이블 ( tables() 함수를 호출하여 볼 수있는 테이블)의 목록과 관련이 있습니까?

환경 :

R 버전 3.1.2 (Windows)
data.table 1.9.4

편집하다 :

@Arun이 주석에서 as.data.table(...) 것처럼 as.data.table(...)as.data.table(...) 과 비슷하게 동작합니다. 사실, 역설적으로 as.data.table(data.frame(...))data.table(...) 보다 data.table(...) 시간은 객체의 수에 따라 선형 적으로 data.table(...) . 예 :

n <- 10000
# create a list containing 10k data.table's using as.data.table
system.time(lotsofDTs <- lapply(1:n,FUN=function(i){ as.data.table(data.frame(A=1:10,B=1:10,ID=i))}),gcFirst=T)
#   user  system elapsed 
#   5.04    0.01    5.04 
n <- 80000
# create a list containing 80k data.table's using as.data.table
system.time(lotsofDFs <- lapply(1:n,FUN=function(i){ as.data.table(data.frame(A=1:10,B=1:10,ID=i))}),gcFirst=T)
#   user   system elapsed
#   44.94    0.12   45.28

https://ffff65535.com


setDT 사용해야합니다.

n <- 80000
system.time(lotsofDTs <- lapply(1:n,FUN=function(i){setDT(list(A=1:10,B=1:10,ID=matrix(i,10)))}),gcFirst=T)
#   user  system elapsed 
#   6.75    0.28    7.17

system.time(lotsofDFs <- lapply(1:n,FUN=function(i){ data.frame(A=1:10,B=1:10,ID=i)}),gcFirst=T)
#   user  system elapsed 
#  32.58    1.40   34.22 




data.table