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çasmarcacoes<-NA
d<-diff(vetor, lag=1)
k<-140
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: vetorCrio 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] 1499855head(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çasd<-diff(vetor, lag=1)
k<-140pctMaiorDepois<-NAmarcacoes<-NAprogress<-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 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.