[R-br] Questão de performance em processamento
Paulo Nogueira Starzynski
paulons em gmail.com
Segunda Setembro 2 15:18:07 BRT 2013
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 <
beniltoncarvalho em gmail.com> 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 <
> eliaskrainski em yahoo.com.br> 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 <paulons em gmail.com> <paulons em gmail.com>
>> *Para:* R-BR <r-br em listas.c3sl.ufpr.br> <r-br em listas.c3sl.ufpr.br>
>> *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
>> R-br em listas.c3sl.ufpr.br
>> 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 listR-br em listas.c3sl.ufpr.brhttps://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
>> R-br em listas.c3sl.ufpr.br
>> 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
> R-br em listas.c3sl.ufpr.br
> 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.
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20130902/4b4158ea/attachment.html>
Mais detalhes sobre a lista de discussão R-br