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> <<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;"><br> Eu nem tenho mais autoridade para fazer cut'n'paste no website...
<br> Solli, você pode cuidar disso?<br> Acho que posso dar uma melhorada nele, ainda...<br> Posto uma versão melhorzinha esta semana, se alguém se comprometer a<br>publicar...<br><br>Lorn wrote:<br>> Como o wendel disse, foi resolvida no perlmonks ( eu devia avisar isso
<br>> aqui ne? malz :( ) mas essa explicacao do champs ai vale um artigo no<br>> site nao?<br>> Da um copy & paste la champs, gostei da explicacao, valeu..<br>><br>> On 4/6/06, *Luis Motta Campos* <<a href="mailto:monsieur_champs@yahoo.com.br">
monsieur_champs@yahoo.com.br</a><br>> <mailto:<a href="mailto:monsieur_champs@yahoo.com.br">monsieur_champs@yahoo.com.br</a>>> wrote:<br>><br>> 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<br>> 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
<br>> 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<br>> 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
<br>> reclamada.<br>><br>><br>> Agora vamos conversar sobre política de uso de memória por um<br>> 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<br>> 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<br>> 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> <mailto:<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>> <<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm">
http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>><br>><br>><br>><br>> --<br>> Lorn<br>> - Slackware Linux<br>> <a href="http://www.slackwarezine.com.br">www.slackwarezine.com.br</a> <
<a href="http://www.slackwarezine.com.br">http://www.slackwarezine.com.br</a>><br>><br>><br>> ------------------------------------------------------------------------<br>><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>
<br><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>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>