Otimizar tempo de processamento

Estou tentando rodar o programa de simulação de percolação (rede de bethe), mas esta demandando um tempo de processamento muito alto, pois há preciso de muitas iterações. O computador que estou utilizando tem processador i3 e 4gb de memória. Alguém pode me dar uma dica de como posso diminuir o tempo de processamento? Abaixo segue o código: programa <- function(f,n,m) { # f: número máximo de filhos # n: número de gerações # m: número de iterações S <- matrix(0,101,2) for (p in seq(0,1,by=0.01)) { pp <- 0 for (g in 1:m) { y <- 1 for (k in 1:n) { y <- sum(rbinom(y,f,p)) if (y == 0) break } if (y > 0) pp <- pp + 1 } S[p/0.01+1,1] <- p S[p/0.01+1,2] <- pp/m } return(S) } prog <- programa(2,100,1000) plot(prog, xlab = "p", ylab = "Probabilidade de Percolação") Desde já agradeço pela atenção! Tiago Vieira.

Tiago, esse e' um problema legal... se vc derivar as distribuicoes a mao, certamente vc consegue ganhos bem maiores... FYI: usando propriedades de estatistica, vc chega na mudanca que eu fiz na geracao das suas variaveis aleatorias. Adicionalmente, eu nao tive paciencia de esperar o seu codigo original acabar de rodar... eu o cancelei depois de um pouco mais de 1h10m. Abaixo uma sugestao para voce: library(foreach) library(doMC) registerDoMC() programa2 <- function(f,n,m) { ## f: número máximo de filhos ## n: número de gerações ## m: número de iterações S <- foreach(p=seq(0,1,by=0.01), .combine=rbind) %dopar% { pp <- 0 for (g in 1:m) { y <- 1 for (k in 1:n) y <- rbinom(1, y*f, p) if (y > 0) pp <- pp + 1 } c(p, pp/m) } return(S) } system.time(prog2 <- programa2(2,200,1000)) plot(prog2, xlab = "p", ylab = "Probabilidade de Percolação") para matar sua curiosidade, no meu computador, eu obtive:
system.time(prog2 <- programa2(2,200,1000)) user system elapsed 257.072 2.562 20.835

Benilton, eu nem cheguei a rodar, analisei o que ele faz mesmo. Tem que resolver esse problema daquele loop que só faz perder tempo senão o próprio estudo de simulação dele está inválido. lmassis <at> yahoo <dot> com <dot> br assis.leonard <at> gmail <dot> com 2011/8/18 Benilton Carvalho <beniltoncarvalho@gmail.com>
Tiago,
esse e' um problema legal... se vc derivar as distribuicoes a mao, certamente vc consegue ganhos bem maiores...
FYI: usando propriedades de estatistica, vc chega na mudanca que eu fiz na geracao das suas variaveis aleatorias.
Adicionalmente, eu nao tive paciencia de esperar o seu codigo original acabar de rodar... eu o cancelei depois de um pouco mais de 1h10m.
Abaixo uma sugestao para voce:
library(foreach) library(doMC) registerDoMC() programa2 <- function(f,n,m) { ## f: número máximo de filhos ## n: número de gerações ## m: número de iterações S <- foreach(p=seq(0,1,by=0.01), .combine=rbind) %dopar% { pp <- 0 for (g in 1:m) { y <- 1 for (k in 1:n) y <- rbinom(1, y*f, p) if (y > 0) pp <- pp + 1 } c(p, pp/m) } return(S) } system.time(prog2 <- programa2(2,200,1000)) plot(prog2, xlab = "p", ylab = "Probabilidade de Percolação")
para matar sua curiosidade, no meu computador, eu obtive:
system.time(prog2 <- programa2(2,200,1000)) user system elapsed 257.072 2.562 20.835
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.

Leonard, para cada 'g', ele determina uma realizacao (aleatoria) de Y_n condicionado em Y_{n-1}. Se essa realizacao por nao-nula, ele incrementa 'pp'. Como a chance de Y_m ser zero e' bem pequena, ele repete o laco 'm' vezes, contando quantas vezes (em 'm') ele observa Y_n > 0... Estou bem certo de que o codigo esta' correto... mas eu tambem estava certo que o Brasil ganharia a Copa America... b 2011/8/18 Leonard Assis <assis.leonard@gmail.com>:
Benilton, eu nem cheguei a rodar, analisei o que ele faz mesmo.
Tem que resolver esse problema daquele loop que só faz perder tempo senão o próprio estudo de simulação dele está inválido. lmassis <at> yahoo <dot> com <dot> br assis.leonard <at> gmail <dot> com
2011/8/18 Benilton Carvalho <beniltoncarvalho@gmail.com>
Tiago,
esse e' um problema legal... se vc derivar as distribuicoes a mao, certamente vc consegue ganhos bem maiores...
FYI: usando propriedades de estatistica, vc chega na mudanca que eu fiz na geracao das suas variaveis aleatorias.
Adicionalmente, eu nao tive paciencia de esperar o seu codigo original acabar de rodar... eu o cancelei depois de um pouco mais de 1h10m.
Abaixo uma sugestao para voce:
library(foreach) library(doMC) registerDoMC() programa2 <- function(f,n,m) { ## f: número máximo de filhos ## n: número de gerações ## m: número de iterações S <- foreach(p=seq(0,1,by=0.01), .combine=rbind) %dopar% { pp <- 0 for (g in 1:m) { y <- 1 for (k in 1:n) y <- rbinom(1, y*f, p) if (y > 0) pp <- pp + 1 } c(p, pp/m) } return(S) } system.time(prog2 <- programa2(2,200,1000)) plot(prog2, xlab = "p", ylab = "Probabilidade de Percolação")
para matar sua curiosidade, no meu computador, eu obtive:
system.time(prog2 <- programa2(2,200,1000)) user system elapsed 257.072 2.562 20.835
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.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)

Boa tarde Pessoal, Estou tendo um problema com uma mensagem de erro: Erro: cannot allocate vector of size 2.6 Gb Estou tendo modificar o limite de memória através do comando mem.limits(), mas sem sucesso. Alguém saberia me dizer qual a limitação física do computador ou se é possível modificar alguma restrição para que eu consiga utilizar um vetor de 2.6Gb. Obrigado, Alexandre

Limitacao do seu sistema operacional, que restringe o tamanho de um processo para algo entre 2.5-3.0 GB... Solucao: upgrade do OS para 64 bits (assumindo que, obviamente, vc tenha mais que 2.5GB RAM) b

Benilton, este seu último parágrafo faz toda a diferença, principalmente se for windows e ele não pretender utilizar asor, ff, bigmemory ou similares. Testei no último semana o R 2.13 64 bits pra windows em um i5 com 6 gb. Ele apitou quando tentou alocar 5.5 GB. lmassis <at> yahoo <dot> com <dot> br assis.leonard <at> gmail <dot> com 2011/8/18 Benilton Carvalho <beniltoncarvalho@gmail.com>
Limitacao do seu sistema operacional, que restringe o tamanho de um processo para algo entre 2.5-3.0 GB...
Solucao: upgrade do OS para 64 bits (assumindo que, obviamente, vc tenha mais que 2.5GB RAM)
b _______________________________________________ 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.

Benilton, Uso linux mais essa quantidade de ram não é o meu caso, de qualquer maneira obrigado, Alexandre dos Santos Engenheiro Florestal, MSc. Universidade Federal de Lavras Departamento de Entomologia Laboratório de Entomologia Florestal Caixa Postal 3037 37200-000 - Lavras/MG Fone: +55 (35) 3829-5122 ________________________________ De: Leonard Assis <assis.leonard@gmail.com> Para: r-br@listas.c3sl.ufpr.br Enviadas: Quinta-feira, 18 de Agosto de 2011 17:54 Assunto: Re: [R-br] Modificar limite de memória Benilton, este seu último parágrafo faz toda a diferença, principalmente se for windows e ele não pretender utilizar asor, ff, bigmemory ou similares. Testei no último semana o R 2.13 64 bits pra windows em um i5 com 6 gb. Ele apitou quando tentou alocar 5.5 GB. lmassis <at> yahoo <dot> com <dot> br assis.leonard <at> gmail <dot> com 2011/8/18 Benilton Carvalho <beniltoncarvalho@gmail.com> Limitacao do seu sistema operacional, que restringe o tamanho de um
processo para algo entre 2.5-3.0 GB...
Solucao: upgrade do OS para 64 bits (assumindo que, obviamente, vc tenha mais que 2.5GB RAM)
b _______________________________________________ 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.

Dependendo exatamente do que vc esta' fazendo, vc pode se beneficiar dos pacotes bigmemory, ff, ncdf... ou mesmo colocando seus dados num banco de dados "de verdade" e trabalhando com porcoes deles... b

Entendi sua explanação. heehhe olhei o código bem por alto depois do almoço num tempó livre, única coisa "estranha" que notei foi esse loop que pra mim estava sem muito sentido. Mas muito dessa minha opinião vai do fato de não conhecer ao fundo o problema, pois para mim, ele estaria interessado em cada uma das iterações (eu, quando faço simulações, procuro guardar cada uma delas, nem que seja pra brincar de bootstrap depois, hehehe) Quanto à copa américa, estava meio na cara que daria Uruguai, é o time com mais conjunto, Argentina e Brasil estavam em início de trabalho. No betclick eu apostei no uruguai e salvei algum, ehhehe lmassis <at> yahoo <dot> com <dot> br assis.leonard <at> gmail <dot> com 2011/8/18 Benilton Carvalho <beniltoncarvalho@gmail.com>
Leonard,
para cada 'g', ele determina uma realizacao (aleatoria) de Y_n condicionado em Y_{n-1}. Se essa realizacao por nao-nula, ele incrementa 'pp'. Como a chance de Y_m ser zero e' bem pequena, ele repete o laco 'm' vezes, contando quantas vezes (em 'm') ele observa Y_n > 0...
Estou bem certo de que o codigo esta' correto... mas eu tambem estava certo que o Brasil ganharia a Copa America...
b
2011/8/18 Leonard Assis <assis.leonard@gmail.com>:
Benilton, eu nem cheguei a rodar, analisei o que ele faz mesmo.
Tem que resolver esse problema daquele loop que só faz perder tempo senão o próprio estudo de simulação dele está inválido. lmassis <at> yahoo <dot> com <dot> br assis.leonard <at> gmail <dot> com
2011/8/18 Benilton Carvalho <beniltoncarvalho@gmail.com>
Tiago,
esse e' um problema legal... se vc derivar as distribuicoes a mao, certamente vc consegue ganhos bem maiores...
FYI: usando propriedades de estatistica, vc chega na mudanca que eu fiz na geracao das suas variaveis aleatorias.
Adicionalmente, eu nao tive paciencia de esperar o seu codigo original acabar de rodar... eu o cancelei depois de um pouco mais de 1h10m.
Abaixo uma sugestao para voce:
library(foreach) library(doMC) registerDoMC() programa2 <- function(f,n,m) { ## f: número máximo de filhos ## n: número de gerações ## m: número de iterações S <- foreach(p=seq(0,1,by=0.01), .combine=rbind) %dopar% { pp <- 0 for (g in 1:m) { y <- 1 for (k in 1:n) y <- rbinom(1, y*f, p) if (y > 0) pp <- pp + 1 } c(p, pp/m) } return(S) } system.time(prog2 <- programa2(2,200,1000)) plot(prog2, xlab = "p", ylab = "Probabilidade de Percolação")
para matar sua curiosidade, no meu computador, eu obtive:
system.time(prog2 <- programa2(2,200,1000)) user system elapsed 257.072 2.562 20.835
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.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins) _______________________________________________ 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.

Benilton, Segui suas dicas e o programa rodou bem, mas quando aumento o número máximo de filhos "f" ou o número de gerações "n" e programa não roda, veja: > library(doMC) > registerDoMC() > programa2 <- function(f,n,m) { + ## f: número máximo de filhos + ## n: número de gerações + ## m: número de iterações + S <- foreach(p=seq(0,1,by=0.01), .combine=rbind) %dopar% { + pp <- 0 + for (g in 1:m) { + y <- 1 + for (k in 1:n) y <- rbinom(1, y*f, p) + if (y > 0) pp <- pp + 1 + } + c(p, pp/m) + } + return(S) + } > system.time(prog2 <- programa2(3,100,1000)) Erro em { : task 48 failed - "valor ausente onde TRUE/FALSE necessário" Além disso: Houve 50 ou mais avisos (use warnings() para ver os primeiros 50) Timing stopped at: 61.27 0.03 61.58 > warnings() Mensagens de aviso: 1: In rbinom(1, y * f, p) : NAs produzidos 2: In rbinom(1, y * f, p) : NAs produzidos 3: In rbinom(1, y * f, p) : NAs produzidos 4: In rbinom(1, y * f, p) : NAs produzidos Em Qui, 2011-08-18 às 17:45 -0300, Leonard Assis escreveu: > Entendi sua explanação. heehhe > > olhei o código bem por alto depois do almoço num tempó livre, única > coisa "estranha" que notei foi esse loop que pra mim estava sem muito > sentido. > > Mas muito dessa minha opinião vai do fato de não conhecer ao fundo o > problema, pois para mim, ele estaria interessado em cada uma das > iterações (eu, quando faço simulações, procuro guardar cada uma delas, > nem que seja pra brincar de bootstrap depois, hehehe) > > Quanto à copa américa, estava meio na cara que daria Uruguai, é o time > com mais conjunto, Argentina e Brasil estavam em início de trabalho. > No betclick eu apostei no uruguai e salvei algum, ehhehe > > lmassis <at> yahoo <dot> com <dot> br > assis.leonard <at> gmail <dot> com > > > > 2011/8/18 Benilton Carvalho <beniltoncarvalho@gmail.com> > Leonard, > > para cada 'g', ele determina uma realizacao (aleatoria) de Y_n > condicionado em Y_{n-1}. Se essa realizacao por nao-nula, ele > incrementa 'pp'. Como a chance de Y_m ser zero e' bem pequena, > ele > repete o laco 'm' vezes, contando quantas vezes (em 'm') ele > observa > Y_n > 0... > > Estou bem certo de que o codigo esta' correto... mas eu tambem > estava > certo que o Brasil ganharia a Copa America... > > b > > 2011/8/18 Leonard Assis <assis.leonard@gmail.com>: > > > Benilton, eu nem cheguei a rodar, analisei o que ele faz > mesmo. > > > > Tem que resolver esse problema daquele loop que só faz > perder tempo senão o > > próprio estudo de simulação dele está inválido. > > lmassis <at> yahoo <dot> com <dot> br > > assis.leonard <at> gmail <dot> com > > > > > > 2011/8/18 Benilton Carvalho <beniltoncarvalho@gmail.com> > >> > >> Tiago, > >> > >> esse e' um problema legal... se vc derivar as distribuicoes > a mao, > >> certamente vc consegue ganhos bem maiores... > >> > >> FYI: usando propriedades de estatistica, vc chega na > mudanca que eu > >> fiz na geracao das suas variaveis aleatorias. > >> > >> Adicionalmente, eu nao tive paciencia de esperar o seu > codigo original > >> acabar de rodar... eu o cancelei depois de um pouco mais de > 1h10m. > >> > >> Abaixo uma sugestao para voce: > >> > >> > >> library(foreach) > >> library(doMC) > >> registerDoMC() > >> programa2 <- function(f,n,m) { > >> ## f: número máximo de filhos > >> ## n: número de gerações > >> ## m: número de iterações > >> S <- foreach(p=seq(0,1,by=0.01), .combine=rbind) %dopar% > { > >> pp <- 0 > >> for (g in 1:m) { > >> y <- 1 > >> for (k in 1:n) > >> y <- rbinom(1, y*f, p) > >> if (y > 0) pp <- pp + 1 > >> } > >> c(p, pp/m) > >> } > >> return(S) > >> } > >> system.time(prog2 <- programa2(2,200,1000)) > >> plot(prog2, xlab = "p", ylab = "Probabilidade de > Percolação") > >> > >> para matar sua curiosidade, no meu computador, eu obtive: > >> > >> > system.time(prog2 <- programa2(2,200,1000)) > >> user system elapsed > >> 257.072 2.562 20.835 > >> _______________________________________________ > >> 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. > > > > > > > -- > Successful people ask better questions, and as a result, they > get > better answers. (Tony Robbins) > > _______________________________________________ > 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.

Tiago, isso e' resultado de y sendo igual a NA ou integer(0). Vc vai precisar trocar o %dopar% por %do% para debugar. Uma sugestao e' comecar por adiciionar umas condicoes para teste dentro do for() for (k in 1:n) y <- rbinom(1, y*f, p) usar algo como for (k in 1:n){ y <- rbinom(1, y*f, p) if (length(y) == 0){ browser() }else{ if (!is.finite(y)) browser() } } b

Tiago, pra que o loop "for (g in 1:m)" se em momento algum do código vc faz uso deste. Como vc construiu, vc rodar com m = 1 ou m - 700 trilhoes produzirá sempre o mesmo resultado, pois vc somente armazena e retorna a ultima iteração. repare neste trecho de seu código: for (g in 1:m) { y <- 1 for (k in 1:n) { y <- sum(rbinom(y,f,p)) if (y == 0) break } if (y > 0) pp <- pp + 1 } viu? está rodando m vezes por aqui e nada de usar o g mais adiante vc tem S[p/0.01+1,1] <- p S[p/0.01+1,2] <- pp/m e em seguida, retorna o S ou seja: um loop completamente inutil lmassis <at> yahoo <dot> com <dot> br assis.leonard <at> gmail <dot> com 2011/8/18 Tiago Vieira <tiagovieira7@yahoo.com.br>
Estou tentando rodar o programa de simulação de percolação (rede de bethe), mas esta demandando um tempo de processamento muito alto, pois há preciso de muitas iterações. O computador que estou utilizando tem processador i3 e 4gb de memória. Alguém pode me dar uma dica de como posso diminuir o tempo de processamento? Abaixo segue o código:
programa <- function(f,n,m) { # f: número máximo de filhos # n: número de gerações # m: número de iterações S <- matrix(0,101,2) for (p in seq(0,1,by=0.01)) { pp <- 0 for (g in 1:m) { y <- 1 for (k in 1:n) { y <- sum(rbinom(y,f,p)) if (y == 0) break } if (y > 0) pp <- pp + 1 } S[p/0.01+1,1] <- p S[p/0.01+1,2] <- pp/m } return(S) }
prog <- programa(2,100,1000) plot(prog, xlab = "p", ylab = "Probabilidade de Percolação")
Desde já agradeço pela atenção!
Tiago Vieira.
_______________________________________________ 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.
participantes (6)
-
Alexandre Santos
-
ASANTOS
-
Benilton Carvalho
-
Leonard Assis
-
Tiago de Oliveira Vieira
-
Tiago Vieira