2015-01-28 22 views
17

data.table nesnesinin ana amacının hızlı altlık/gruplama vb. Izin vermesi gerektiğinin farkındayım ve büyük bir data.table ve alt kümesine sahip olmak çok daha mantıklı. Çok (muhtemelen küçük) data.table nesneye sahip olmaktan çok (çok verimli).R - çok sayıda data.table nesnesi oluştururken yavaş performans

Bu yakın zamanda, çok sayıda data.table nesnesini örnekleyen bir komut dosyası hazırladım ve performansın bellekte data.table's bellek sayısı arttıkça azaldığını fark ettim.

Burada ne demek istediğimi bir örnek: data.frame's oluşturma zamanı yarattı data.frame's sayısı ile doğrusal olarak büyür iken,

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 

Anlaşıldığı gibi, data.table karmaşıklığı doğrusal daha fazla görünüyor.

Bu durum bekleniyor mu?

Bu, bellek içi tabloların listesiyle (tables() işlevini çağırarak görebildiğiniz) bir ilgisi var mı?


Çevre:

(Windows'da) R versiyonu 3.1.2
data.table 1.9.4


DÜZENLEME:

olarak işaret tarafından @Arun, as.data.table(...) görünüyor gibi görünüyor data.frame(...) ile benzer şekilde davranır. Gerçekte, paradoksal olarak as.data.table(data.frame(...)), data.table(...)'dan daha hızlıdır ve zaman, örn. :

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 
+1

Bu bağımlı oldukça sistemi olmalıdır. İlk ikide sırasıyla df ve dt için 2.35 ve 2.82 elde ettim. –

+6

'Rprof()' yi çalıştırdınız mı? "Alloc.col" (sütun göstergelerinin aşırı tahsisi) için harcanan zamanı göstermeli ...: meraklı: bu 50K data.tables ile ne yapıyorsunuz? Demek istediğim, ne tür bir görev bu kadar çok nesneyi gerektirir? – Arun

+0

'as.data.table (liste (...))', data.frame()/as.data.frame() 'ile benzer şekilde gerçekleştirir. 'Data.table()' ın geliştirilebileceğini düşünmeme izin veriyor .. – Arun

cevap

1

Sen setDT kullanmalıdır:

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 
İlgili konular