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

Envie o arquivo que usou para gerar estes dados. 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

A questão é: porque perde performance e o que posso fazer a respeito?
Perde-se performance nesse tipo de algoritmo quando se implementa-o em qualquer linguagem não compilada. Por exemplo: Java, Matlab, R, etc. Qualquer programador de Matlab, por exemplo, diria que é 'proibido' ter um laço for dentro do outro. O mesmo dizemos a respeito do R.

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. Não entendi completamente o objetivo. Teste diff() x <- -5:10 diff(x)

Elias, não entendi sua pergunta. O meu problema é a performance ao avaliar muitos subvetores de um vetor maior. As operações em si são simples, basicamente o diff e um quociente. Porém, lancei a questão aqui para ver se alguém poderia se manifestar com relação à performance, mas segundo a mensagem do Elias parece que é assim mesmo que funciona em linguagens não compiladas. Abraços, Paulo Em 2 de setembro de 2013 03:21, Elias Teixeira Krainski < eliaskrainski@yahoo.com.br> escreveu:
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.
Não entendi completamente o objetivo. Teste diff() x <- -5:10 diff(x)
______________________________**_________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/**cgi-bin/mailman/listinfo/r-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<http://www.leg.ufpr.br/r-br-guia>) e forneça código mínimo reproduzível.

Elias, respondi sua mensagem para você e te citando! rs Meu lapso... Mas mantenho o dito, que o ponto são os subvetores. Porém, existe algum laço dentro de laço no me código? Acho que não, ao menos explícito tenho apenas um for. Abraços, Paulo Nogueria Stazrynski Em 2 de setembro de 2013 10:19, Paulo Nogueira Starzynski <paulons@gmail.com
escreveu:
Elias, não entendi sua pergunta.
O meu problema é a performance ao avaliar muitos subvetores de um vetor maior. As operações em si são simples, basicamente o diff e um quociente. Porém, lancei a questão aqui para ver se alguém poderia se manifestar com relação à performance, mas segundo a mensagem do Elias parece que é assim mesmo que funciona em linguagens não compiladas.
Abraços, Paulo
Em 2 de setembro de 2013 03:21, Elias Teixeira Krainski < eliaskrainski@yahoo.com.br> escreveu:
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.
Não entendi completamente o objetivo. Teste diff() x <- -5:10 diff(x)
______________________________**_________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/**cgi-bin/mailman/listinfo/r-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<http://www.leg.ufpr.br/r-br-guia>) e forneça código mínimo reproduzível.

se for um laco muito longo = problema nao vi codigo seu, entao nao da p saber se e' possivel vetorizar On 09/02/2013 03:22 PM, Paulo Nogueira Starzynski wrote:
Elias, respondi sua mensagem para você e te citando! rs Meu lapso...
Mas mantenho o dito, que o ponto são os subvetores. Porém, existe algum laço dentro de laço no me código? Acho que não, ao menos explícito tenho apenas um for.
Abraços, Paulo Nogueria Stazrynski
Em 2 de setembro de 2013 10:19, Paulo Nogueira Starzynski <paulons@gmail.com <mailto:paulons@gmail.com>> escreveu:
Elias, não entendi sua pergunta.
O meu problema é a performance ao avaliar muitos subvetores de um vetor maior. As operações em si são simples, basicamente o diff e um quociente. Porém, lancei a questão aqui para ver se alguém poderia se manifestar com relação à performance, mas segundo a mensagem do Elias parece que é assim mesmo que funciona em linguagens não compiladas.
Abraços, Paulo
Em 2 de setembro de 2013 03:21, Elias Teixeira Krainski <eliaskrainski@yahoo.com.br <mailto:eliaskrainski@yahoo.com.br>> escreveu:
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.
Não entendi completamente o objetivo. Teste diff() x <- -5:10 diff(x)

A sugestao, mais especificamente, 'e para usar funcoes prontas para operacoes simples. Isto porque e' simplesmente *proibido* implementar repeticoes longas de operacoes simples em linguagens nao compiladas. No seu exemplo, veja as funcoes *prontas* para esse tipo de operacao simples diff(), rle() On 09/02/2013 03:19 PM, Paulo Nogueira Starzynski wrote:
Elias, não entendi sua pergunta.
O meu problema é a performance ao avaliar muitos subvetores de um vetor maior. As operações em si são simples, basicamente o diff e um quociente. Porém, lancei a questão aqui para ver se alguém poderia se manifestar com relação à performance, mas segundo a mensagem do Elias parece que é assim mesmo que funciona em linguagens não compiladas.
Abraços, Paulo
Em 2 de setembro de 2013 03:21, Elias Teixeira Krainski <eliaskrainski@yahoo.com.br <mailto:eliaskrainski@yahoo.com.br>> escreveu:
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.
Não entendi completamente o objetivo. Teste diff() x <- -5:10 diff(x)

Elias, vou verificar as sugestões. Obrigado. PNS Em 2 de setembro de 2013 10:24, Elias T Krainski <eliaskrainski@yahoo.com.br
escreveu:
A sugestao, mais especificamente, 'e para usar funcoes prontas para operacoes simples. Isto porque e' simplesmente *proibido* implementar repeticoes longas de operacoes simples em linguagens nao compiladas. No seu exemplo, veja as funcoes *prontas* para esse tipo de operacao simples diff(), rle()
On 09/02/2013 03:19 PM, Paulo Nogueira Starzynski wrote:
Elias, não entendi sua pergunta.
O meu problema é a performance ao avaliar muitos subvetores de um vetor maior. As operações em si são simples, basicamente o diff e um quociente. Porém, lancei a questão aqui para ver se alguém poderia se manifestar com relação à performance, mas segundo a mensagem do Elias parece que é assim mesmo que funciona em linguagens não compiladas.
Abraços, Paulo
Em 2 de setembro de 2013 03:21, Elias Teixeira Krainski < eliaskrainski@yahoo.com.br> escreveu:
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.
Não entendi completamente o objetivo. Teste diff() x <- -5:10 diff(x)
_______________________________________________ R-br mailing list R-br@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.

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@gmail.com> Para: R-BR <r-br@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@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.

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@gmail.com> *Para:* R-BR <r-br@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@listas.c3sl.ufpr.br <mailto:R-br@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@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.

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@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@gmail.com> <paulons@gmail.com> *Para:* R-BR <r-br@listas.c3sl.ufpr.br> <r-br@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@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@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@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.

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@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@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@gmail.com> <paulons@gmail.com> *Para:* R-BR <r-br@listas.c3sl.ufpr.br> <r-br@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@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@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@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@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.

On 09/01/2013 12:22 PM, Paulo Nogueira Starzynski wrote:
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.
Paulo fiz algumas mexidas no seu código acho que ficou muito bom, mas veja se resolve. A principal diferença foi eliminar o if dentro do loop com o uso de um outro vetor d.adj. No meu sistema rodou tudo em 14.22 segundos com os passos variando entre 0.23 a 0.26. Considerando que não tenho nenhuma otimização no meu R acho que está bom ... []s Tura vetor <- rnorm(1499855, mean=46.21,sd=6) d<-diff(vetor) k<-140 progress<-seq(2,(length(vetor)-k), by=10000) d.adj <- d[d>0] tam<- length(d.adj) pctMaiorDepois<-vector('numeric', tam) marcacoes<-NA t1<-Sys.time() for (i in 2:tam){ subVetorD<-d.adj[(i+1):(i+k)] pctMaiorDepois[i]<-mean(subVetorD>0) if (any(i==progress)) { t2<-Sys.time() print(paste(round(i/tam,2), round(difftime(t2,t1,units="secs"),2))) t1<-t2 } }

Obrigado a todos pela ajuda e debate. A principal diferença foi alocar todo o vetor antes de começar a atribuir valores às suas posições. Essa modificação fez um processo de aproximadamente 15 minutos ser executado em menos de 45 segundos!! Abraços, Paulo Nogueira Starzynski Em 2 de setembro de 2013 18:33, Bernardo Rangel Tura <tura@centroin.com.br>escreveu:
On 09/01/2013 12:22 PM, Paulo Nogueira Starzynski wrote:
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.
Paulo fiz algumas mexidas no seu código acho que ficou muito bom, mas veja se resolve. A principal diferença foi eliminar o if dentro do loop com o uso de um outro vetor d.adj. No meu sistema rodou tudo em 14.22 segundos com os passos variando entre 0.23 a 0.26. Considerando que não tenho nenhuma otimização no meu R acho que está bom ...
[]s Tura
vetor <- rnorm(1499855, mean=46.21,sd=6) d<-diff(vetor) k<-140 progress<-seq(2,(length(vetor)**-k), by=10000) d.adj <- d[d>0] tam<- length(d.adj) pctMaiorDepois<-vector('**numeric', tam) marcacoes<-NA
t1<-Sys.time() for (i in 2:tam){ subVetorD<-d.adj[(i+1):(i+k)] pctMaiorDepois[i]<-mean(**subVetorD>0)
if (any(i==progress)) { t2<-Sys.time() print(paste(round(i/tam,2), round(difftime(t2,t1,units="**secs"),2))) t1<-t2 } }
______________________________**_________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/**cgi-bin/mailman/listinfo/r-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<http://www.leg.ufpr.br/r-br-guia>) e forneça código mínimo reproduzível.
participantes (7)
-
Benilton Carvalho
-
Bernardo Rangel Tura
-
Elias T Krainski
-
Elias Teixeira Krainski
-
Mauro Sznelwar
-
Paulo Nogueira Starzynski
-
Rubem Kaipper Ceratti