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