Como o wendel disse, foi resolvida no perlmonks ( eu devia avisar isso aqui ne? malz :( ) mas essa explicacao do champs ai vale um artigo no site nao? <br>Da um copy & paste la champs, gostei da explicacao, valeu..<br>
<br><div><span class="gmail_quote">On 4/6/06, <b class="gmail_sendername">Luis Motta Campos</b> <<a href="mailto:monsieur_champs@yahoo.com.br">monsieur_champs@yahoo.com.br</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Lorn wrote:<br>> Rau mongers!<br>><br>> Estou com uma duvida, tem um programa em perl aqui na empresa, que<br>> indexa documentos, e enquanto ele vai indexando a memoria vai caindo, e<br>> no final, ele fica usando a memoria virtual, depois que o programa
<br>> termina ele não libera a memoria, eu acho ( tenho quase certeza ) que<br>> não tem nada parecido com o free do C no perl, e eu acho também que o<br>> linux deixar essa memoria no "buffer" pra acessar mais rapido se eu for
<br>> rodar o programa de novo, eu só queria confirmar isso, alguem já leu<br>> alguma coisa sobre como é gerenciada a memoria no linux?<br>><br><br> Lorn, isto fede a /memory leak/. Me parece que seu programa perl
<br>comete dois erros muito importantes de alocação de memória:<br><br> 1. Aloca memória em ciclos, que nunca "perde referências" (e assim<br>não pode ser reclamada de volta pela máquina virtual do Perl)<br> 2. Aloca memória demais, sem implementar código minimamente
<br>preocupado com isso.<br><br> Vamos aos exemplos didáticos:<br><br> Como o Perl Aloca Memória<br><br> Como qualquer outra máquina virtual, a VM do Perl aloca memória para<br>os programas que interpreta em tempo de execução, conforme a necessidade
<br>do programa e as estruturas de dados que este criar dinâmicamente.<br><br> Como qualquer outra máquina virtual, a VM do Perl é totalmente<br>responsável pelo gerenciamento da memória alocada para os programas em<br>
execução. O programador praticamente não precisa intervir neste assunto,<br>o que torna programar uma tarefa muito mais interessante, já que muitos<br>dos problemas relacionados com a programação são automágicamente<br>resolvidos pela máquina virtual do Perl.
<br><br> Claro, como toda boa solução, esta também tem desvantagens.<br> A máquina virtual do Perl não consegue lidar muito bem com alocação<br>cíclica de memória, por que usa um /garbage collector/ por copia. Sendo<br>
assim, quando o programador diz coisas como<br><br> my $struct = { data => 2, struct => { data => 3, struct => undef } };<br> $struct->{struct}{struct} = $struct;<br><br> Criamos automaticamente uma referência cíclica para $struct.
<br><br> Quando acontece coisas como esta, a VM do Perl aloca memória sem<br>dificuldade, mas simplesmente não consegue reclamar a memória de volta,<br>por que existe sempre uma referência para o hash anônimo apontado por
<br>$struct, *mesmo* *quando* *dizemos*<br><br> undef $struct;<br><br> (Talvez exista um padrão como este nos teus scripts, Lorn).<br><br> Para resolver isto, e ter certeza de que conseguiremos reclamar a<br>memória de volta, precisamos quebrar o ciclo:
<br><br> $struct->{struct}{struct} = undef;<br> undef $struct;<br><br> Isto resolve o problema, fazendo com que o /garbage collector/ do<br>perl seja capaz de perceber que as estruturas de dados apontadas por<br>
$struct não estão mais sendo utilizadas e podem ter sua memória reclamada.<br><br><br> Agora vamos conversar sobre política de uso de memória por um programa.<br><br> Quando um programa lê informações do mundo exterior (como da web ou
<br>de um banco de dados, por exemplo), normalmente não se preocupa com o<br>tamanho da informação que está lendo.<br><br> Isto é potencialmente um problema, conforme a quantidade de<br>informações lidas aumenta. Afirmo isto por que, caso estejamos fazendo
<br>uma pergunta ao banco de dados por uma informação volumosa, podemos<br>terminar com muitos gigabytes de memória alocada para muito pouca coisa.<br><br> Por exemplo:<br><br> my $dbh = DBI::connect( $dn, $user, $passwd ) or die $DBI::errstr;
<br> my $sth =<br> $dbh->prepare( q{SELECT uid, name, login, password FROM user} );<br> $sth->execute() or die $dbh->errstr;<br> my @users = $sth->fetchall_arrayref({}) or die $dbh->errstr;<br><br>
Neste ponto, temos um problema potencial muito grave: se nossa base<br>de dados tiver 30 usuários, vamos ler todos os dados e seguir sem problemas.<br><br> Agora, se tivermos 300.000 usuários no banco de dados, isto vai
<br>custar *muita* memória. E vai demorar *muito*.<br><br> Tá. Eu sei, meu exemplo é meio bobo, mas acho que o pessoal entendeu<br>o problema. O importante é: não leia mais dados do que você vai<br>precisar, especialmente quando está lendo de arquivos (que são muito
<br>mais perigosos que bancos de dados).<br><br> Evite usar foreach() quando sabe que o conjunto de dados pode ser<br>eventualmente grande, já que esta palavra chave do perl precisa alocar<br>todos os elementos em memória antes de iterar sobre eles.
<br><br> Evite ler arquivos para arrays sem necessidade absoluta e inevitável.<br><br> Em caso de problemas, consulte o seu guru.<br> Chega, que eu já escrevi demais.<br>--<br>=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
<br> Luis Motta Campos is Software Engineer, Oracle OCP/DBA, Un*x<br> Sysadmin, Member of {Lisbon,São Paulo,Cascavel,Brasil,London}<br> Perl Mongers and Perl Fanatic Evangelist<br>=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
<br><br><br><br><br>_______________________________________________________<br>Yahoo! Acesso Grátis - Internet rápida e grátis. Instale o discador agora!<br><a href="http://br.acesso.yahoo.com">http://br.acesso.yahoo.com</a>
<br>_______________________________________________<br>SaoPaulo-pm mailing list<br><a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br><a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm">http://mail.pm.org/mailman/listinfo/saopaulo-pm
</a><br></blockquote></div><br><br clear="all"><br>-- <br>Lorn <br>- Slackware Linux<br><a href="http://www.slackwarezine.com.br">www.slackwarezine.com.br</a>