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 &amp; 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> &lt;<a href="mailto:monsieur_champs@yahoo.com.br">monsieur_champs@yahoo.com.br</a>&gt; 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>&gt; Rau mongers!<br>&gt;<br>&gt; Estou com uma duvida, tem um programa em perl aqui na empresa, que<br>&gt; indexa documentos, e enquanto ele vai indexando a memoria vai caindo, e<br>&gt; no final, ele fica usando a memoria virtual, depois que o programa
<br>&gt; termina ele não libera a memoria, eu acho ( tenho quase certeza ) que<br>&gt; não tem nada parecido com o free do C no perl, e eu acho também que o<br>&gt; linux deixar essa memoria no &quot;buffer&quot; pra acessar mais rapido se eu for
<br>&gt; rodar o programa de novo, eu só queria confirmar isso, alguem já leu<br>&gt; alguma coisa sobre como é gerenciada a memoria no linux?<br>&gt;<br><br>&nbsp;&nbsp; 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>&nbsp;&nbsp; 1. Aloca memória em ciclos, que nunca &quot;perde referências&quot; (e assim<br>não pode ser reclamada de volta pela máquina virtual do Perl)<br>&nbsp;&nbsp; 2. Aloca memória demais, sem implementar código minimamente
<br>preocupado com isso.<br><br>&nbsp;&nbsp; Vamos aos exemplos didáticos:<br><br>&nbsp;&nbsp; Como o Perl Aloca Memória<br><br>&nbsp;&nbsp; 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>&nbsp;&nbsp; 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>&nbsp;&nbsp; Claro, como toda boa solução, esta também tem desvantagens.<br>&nbsp;&nbsp; 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>&nbsp;&nbsp; my $struct = { data =&gt; 2, struct =&gt; { data =&gt; 3, struct =&gt; undef } };<br>&nbsp;&nbsp; $struct-&gt;{struct}{struct} = $struct;<br><br>&nbsp;&nbsp; Criamos automaticamente uma referência cíclica para $struct.
<br><br>&nbsp;&nbsp; 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>&nbsp;&nbsp; undef $struct;<br><br>&nbsp;&nbsp; (Talvez exista um padrão como este nos teus scripts, Lorn).<br><br>&nbsp;&nbsp; Para resolver isto, e ter certeza de que conseguiremos reclamar a<br>memória de volta, precisamos quebrar o ciclo:
<br><br>&nbsp;&nbsp; $struct-&gt;{struct}{struct} = undef;<br>&nbsp;&nbsp; undef $struct;<br><br>&nbsp;&nbsp; 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>&nbsp;&nbsp; Agora vamos conversar sobre política de uso de memória por um programa.<br><br>&nbsp;&nbsp; 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>&nbsp;&nbsp; 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>&nbsp;&nbsp; Por exemplo:<br><br>&nbsp;&nbsp; my $dbh = DBI::connect( $dn, $user, $passwd ) or die $DBI::errstr;
<br>&nbsp;&nbsp; my $sth =<br>&nbsp;&nbsp;&nbsp;&nbsp; $dbh-&gt;prepare( q{SELECT uid, name, login, password FROM user} );<br>&nbsp;&nbsp; $sth-&gt;execute() or die $dbh-&gt;errstr;<br>&nbsp;&nbsp; my @users = $sth-&gt;fetchall_arrayref({}) or die $dbh-&gt;errstr;<br><br>
&nbsp;&nbsp; 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>&nbsp;&nbsp; Agora, se tivermos 300.000 usuários no banco de dados, isto vai
<br>custar *muita* memória. E vai demorar *muito*.<br><br>&nbsp;&nbsp; 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>&nbsp;&nbsp; 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>&nbsp;&nbsp; Evite ler arquivos para arrays sem necessidade absoluta e inevitável.<br><br>&nbsp;&nbsp; Em caso de problemas, consulte o seu guru.<br>&nbsp;&nbsp; Chega, que eu já escrevi demais.<br>--<br>=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
<br>&nbsp;&nbsp;Luis Motta Campos is Software Engineer, Oracle OCP/DBA, Un*x<br>&nbsp;&nbsp;Sysadmin, Member of {Lisbon,São Paulo,Cascavel,Brasil,London}<br>&nbsp;&nbsp;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>