Senhores, muito obrigado pela ajuda. Vou testar as sugestões e retorno. É muito importante tentar entender melhor como o R trabalha internamente, para escrever códigos mais rápidos e, no mínimo, mais elegantes.
Abraços, Paulo Nogueira Starzynski Em 2 de setembro de 2013 14:34, Benilton Carvalho < [email protected]> escreveu: > pctMaiorDepois2 <- rep(NA_real_, length(d)) > for (i in (which(d[-length(d)] > 0)+1)){ > pctMaiorDepois2[i] <- mean(d[(i+1):(i+k)] > 0) > } > > (7 segundos num laptop q nao esta' otimizado p performance... e ainda deve > ganhar 1s ao compilar o conjunto como uma funcao) > > b > > > Em 2 de setembro de 2013 12:01, Elias T Krainski < > [email protected]> escreveu: > > Bem lembrado Rubem! A licao nisso e': E' mais eficiente alocar todo o >> vetor em memoria antes do que fazer realocacoes durante o preencimento do >> mesmo. >> >> Seque abaixo um teste que fiz fazendo em paralelo com mclapply(). O >> codigo original demorou 11 segundos. com mclapply() (4 cores) demorou 9 >> segundos. Ou seja, a operacao nao e' tao complicada que justifique a >> execucao em paralelo. >> >> >> vetor <- rnorm(1499855) >> ###diferenças >> >> d<-diff(vetor, lag=1) >> >> k<-140 >> marcacoes<-NA >> progress<-seq(2,(length(vetor)-k), by=1000) >> tam <- (length(vetor)-k) >> >> t1<-Sys.time() >> >> system.time({ >> pctMaiorDepois <- rep(NA, tam) >> >> for (i in 2:tam){ >> if (d[i-1] > 0) { >> subVetorD<-d[(i+1):(i+k)] >> pctMaiorDepois[i]<-sum(subVetorD>0)/k >> } >> } >> }) >> >> require(parallel) >> system.time({ >> res <- simplify2array(mclapply( >> 2:tam, function(j) >> if (d[j-1]>0) >> return(sum(d[(j+1):(j+k)]>0)/k) >> else return(NA), >> mc.cores=detectCores())) >> }) >> >> all.equal(pctMaiorDepois[-1],res) >> >> Att. >> Elias. >> >> >> On 09/02/2013 03:44 PM, Rubem Kaipper Ceratti wrote: >> >> Paulo, >> >> Creio que o problema de performance do seu seu código se deva ao >> crescimento do objeto pctMaiorDepois. Substitua a linha >> >> pctMaiorDepois<-NA >> >> por >> >> pctMaiorDepois <- vector('numeric', tam) >> >> >> >> Att., >> Rubem >> >> ------------------------------ >> *De:* Paulo Nogueira Starzynski <[email protected]> <[email protected]> >> *Para:* R-BR <[email protected]> <[email protected]> >> *Enviadas:* Domingo, 1 de Setembro de 2013 12:22 >> *Assunto:* [R-br] Questão de performance em processamento >> >> Senhores, >> recorro a lista para buscar ajuda referente a uma questão de tempo de >> processamento no R. >> Escrevi um código para realizar, basicamente, operação de contagem dentro >> de subvetores de um vetor maior. O problema é que a performance vai caindo >> conforme a tarefa é executada. >> >> Tenho o vetor principal de dados: *vetor* >> Crio o vetor de diferenças vetor[i] - vetor[(i-1)]: *d* >> >> A tarefa é simples e consiste em avaliar, a partir da i-ésima posição >> do vetor principal, o subvetor que vai de (i+1) até (i+k), calculando a >> proporção de valores que são maiores que o valor anterior dentro desse >> subvetor. Faço a tarefa avaliando um subvetor de cada vez, reciclando o >> mesmo objeto chamado subVetorD. >> O ponto é que a cada subvetor avaliado o processamento vai ficando mais >> lento e para vetores muito longos a performance fica muito prejudicada. >> A questão é: porque perde performance e o que posso fazer a respeito? >> >> Abaixo envio um CMR, que não o é de fato, porque o vetor principal >> contém apenas alguns registros, a caráter ilustrativo. >> ########## >> length(vetor) >> #[1] 1499855 >> head(vetor) >> #[1] 39.2738 39.5016 39.5299 39.4839 39.4614 39.6217 >> summary(vetor) >> # Min. 1st Qu. Median Mean 3rd Qu. Max. >> # 14.25 31.95 50.02 46.21 57.73 89.87 >> >> #diferenças >> d<-diff(vetor, lag=1) >> >> k<-140 >> pctMaiorDepois<-NA >> marcacoes<-NA >> progress<-seq(2,(length(vetor)-k), by=10000) >> tam<-(length(vetor)-k) >> t1<-Sys.time() >> for (i in 2:tam){ >> if (d[i-1] > 0) { >> subVetorD<-d[(i+1):(i+k)] >> pctMaiorDepois[i]<-sum(subVetorD>0)/k >> } >> if (any(i==progress)) { >> t2<-Sys.time() >> print(paste(round(i/tam,2), round(difftime(t2,t1,units="secs"),2))) >> t1<-t2 >> } >> } >> >> A seguir está o resultado do print() acima, que parei em 70% do >> processamento completo, para mostrar como o tempo (em segundos) vai >> aumentando. >> % processamento ; tempos em segundos >> [1] "0 0.77" >> [1] "0.01 0.24" >> [1] "0.01 0.33" >> [1] "0.02 0.42" >> [1] "0.03 0.53" >> [1] "0.03 0.64" >> [1] "0.04 0.73" >> [1] "0.05 0.86" >> [1] "0.05 0.94" >> [1] "0.06 1.04" >> [1] "0.07 1.21" >> [1] "0.07 1.27" >> [1] "0.08 1.38" >> [1] "0.09 1.49" >> [1] "0.09 1.61" >> [1] "0.1 1.79" >> [1] "0.11 1.92" >> [1] "0.11 2.16" >> [1] "0.12 2.5" >> [1] "0.13 3.1" >> [1] "0.13 3.14" >> [1] "0.14 3.42" >> [1] "0.15 3.53" >> [1] "0.15 3.74" >> [1] "0.16 3.88" >> [1] "0.17 3.99" >> [1] "0.17 4.23" >> [1] "0.18 4.45" >> [1] "0.19 4.66" >> [1] "0.19 4.96" >> [1] "0.2 5.03" >> [1] "0.21 5.06" >> [1] "0.21 5.63" >> [1] "0.22 6.23" >> [1] "0.23 6.4" >> [1] "0.23 6.2" >> [1] "0.24 6.71" >> [1] "0.25 6.76" >> [1] "0.25 6.54" >> [1] "0.26 6.5" >> [1] "0.27 6.72" >> [1] "0.27 6.67" >> [1] "0.28 6.87" >> [1] "0.29 7.04" >> [1] "0.29 7.51" >> [1] "0.3 7.69" >> [1] "0.31 7.62" >> [1] "0.31 7.54" >> [1] "0.32 7.82" >> [1] "0.33 8.16" >> [1] "0.33 8.43" >> [1] "0.34 8.99" >> [1] "0.35 8.55" >> [1] "0.35 8.98" >> [1] "0.36 8.99" >> [1] "0.37 9.53" >> [1] "0.37 10.09" >> [1] "0.38 9.88" >> [1] "0.39 9.78" >> [1] "0.39 10.01" >> [1] "0.4 9.66" >> [1] "0.41 9.8" >> [1] "0.41 10.14" >> [1] "0.42 10.04" >> [1] "0.43 10.81" >> [1] "0.43 10.94" >> [1] "0.44 11.05" >> [1] "0.45 11.64" >> [1] "0.45 11.73" >> [1] "0.46 11.7" >> [1] "0.47 11.65" >> [1] "0.47 11.63" >> [1] "0.48 11.68" >> [1] "0.49 12.08" >> [1] "0.49 12.34" >> [1] "0.5 13.35" >> [1] "0.51 13.66" >> [1] "0.51 13.84" >> [1] "0.52 13.87" >> [1] "0.53 14.94" >> [1] "0.53 14.42" >> [1] "0.54 14.71" >> [1] "0.55 14.51" >> [1] "0.55 13.72" >> [1] "0.56 14.7" >> [1] "0.57 14.75" >> [1] "0.57 13.83" >> [1] "0.58 14.34" >> [1] "0.59 15.11" >> [1] "0.59 15.09" >> [1] "0.6 15.12" >> [1] "0.61 16.49" >> [1] "0.61 18.3" >> [1] "0.62 17.77" >> [1] "0.63 16.87" >> [1] "0.63 16.17" >> [1] "0.64 17.09" >> [1] "0.65 17.04" >> [1] "0.65 16.38" >> [1] "0.66 15.84" >> [1] "0.67 16.39" >> [1] "0.67 16.6" >> [1] "0.68 17.32" >> [1] "0.69 17.05" >> [1] "0.69 17.87" >> [1] "0.7 18.27" >> >> >> Abraços, >> Paulo Nogueira Starzynski >> >> >> >> _______________________________________________ >> R-br mailing list >> [email protected] >> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br >> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça >> código mínimo reproduzível. >> >> >> >> _______________________________________________ >> R-br mailing >> [email protected]https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br >> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código >> mínimo reproduzível. >> >> >> >> _______________________________________________ >> R-br mailing list >> [email protected] >> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br >> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça >> código mínimo reproduzível. >> > > > _______________________________________________ > R-br mailing list > [email protected] > https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br > Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça > código mínimo reproduzível. >
_______________________________________________ R-br mailing list [email protected] https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.
