[R-br] R 2.15.1, eficiência com BIG's data.frame e tabelas

Elias T. Krainski eliaskrainski em yahoo.com.br
Sexta Junho 29 16:32:22 BRT 2012


Olá a todos

Duas coisas sobre tabulação de dados. Considerar ambas pode tornar possível executar uma tarefa com um BIG data.frame em R.

1) o pacote dataframe foi criado para melhorar a performance em trabalhar com data.frame. O autor desse pacote, Tim Hesterberg, trabalha o Google. Ele apresentou seu pacote no useR! 2012 e as idéias de programação utilizadas. O r-core member Luke Tierney implementou essas idéias no R base, na versão 2.15.1 (released a uma semana). Li isso em 
   http://www.r-bloggers.com/r-2-15-1-includes-performance-improvements-inspired-by-dataframe-package/ 
e sugiro fortemente o upgrade do R para a versão 2.15.1, pois: 
 - Tim Hesterberg created the dataframe package to speed up R for 500+ R users at Google, and the talk from his colleague Karl Millar on using Google's big-data infrastructure with R. 
 - Tim reported that using the dataframe package with R 2.15.0 improved performance by 21% for creation and column subscripting, and by 14% for row subscripting.
 - Além dessa sugestão, o Tim Hesterberg fez também sugestão que melhora a performance da função tabulate(), usada pela função table(). A sugestão dele é usar dup=FALSE no .C() da tabulate(), que as vezes usamos papa chamar nossos códigos em C, correndo um certo risco. Esta sugestão evita duplicação de memória. Ou seja, a diferença está em conseguir ou não fazer uma tabela com um BIG data em R.

Nos dois testes abaixo, fiz com as duas versões do R,
  n <- 1e5; ns=10
  system.time(replicate(ns, data.frame(a=rep(gl(3,5),n))))
  system.time(replicate(ns, table(rep(gl(3,5),n))))

houve redução, da versão 2.15.1 em relação a versão 2.15.0, de 22% no primeiro teste e 8% no segundo teste.



2) Ha alguns dias o Walmes mostrou-me um post no r-bloggers mostrando a eficiência do pacote data.table 
  http://www.r-bloggers.com/transforming-subsets-of-data-in-r-with-by-ddply-and-data-table/
Foi reportado nesse post que, usando a R 2.15.0, usar o pacote data.table é 95 vezes mais rápido que usar do.call com by e 120 vezes mais rápido que usar ddply (do pacote plyr). 

Testei o seguinte script com R 2.15.0 e R 2.15.1 (similar ao postado no blog)


 require(plyr)
 require(data.table)
 
 set.seed(1)
 df <- data.frame(Company=rep(paste("Company", 1:100),1000),
                  Product=gl(50,200), 
                  Year=sort(rep(2002:2011,10000)), 
                  Sales=rnorm(100000,100,10))

 fn <- function(x) x/sum(x)
 
 r1 <- system.time(
  R1 <- do.call("rbind", as.list(
    by(df, df[c("Company","Year")], 
       transform, Share=fn(Sales))
  ))
 )
 
 r2 <- system.time(
  R2 <- ddply(df, c("Company", "Year"), 
              transform, Share=fn(Sales))
 )

 r3 <- system.time({
  dt <- data.table(df)
  setkey(dt, "Year", "Company")
  X <- dt[, list(SUM=sum(Sales)), by=key(dt)]
  R3 <- dt[X, list(Company, Sales, Product, Share=Sales/SUM)]
 })
 
Como o data.table já era otimizado, não houve redução significativa da versão R 2.15.0 para a R 2.15.1. Houve redução de 20% usando do.call com by ou usando ddply. Ou seja, usar o data.table ainda é muito mais rápido que usar do.call com by ou ddply.

Att.
Elias T. Krainski
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20120629/155d13f9/attachment.html>


Mais detalhes sobre a lista de discussão R-br