[SP-pm] WWW::Scripter - Como tirar o objeto da memória

Luis Motta Campos luismottacampos at yahoo.co.uk
Fri Apr 16 13:08:47 PDT 2010


Andre Carneiro wrote:
> Eu achei isso
> aqui:*Devel::Size*<http://search.cpan.org/%7Etels/Devel-Size-0.71/lib/Devel/Size.pm>
> 
> Não consigo desalocar com isso, mas consigo monitorar., mas pelo
> menos dá pra monitorar algumas coisas com isso.
> 
> Se alguém souber de algum módulo onde eu posso, através da variável
> onde o objeto está, desalocar 'na marra', me avisem. Quanto a mim vou
> continuar procurando alguma solução...
> 

André,

Desculpe a demora em responder, meu amigo. O fuso horário não me ajuda a
acompanhar nada em tempo real, agora...

Perguntas simples, para começar:

1. Eu vi o trecho de código, mas não consigo executar aquilo para
reproduzir o problema. Será que você pode reduzir o problema ao mínimo
de código **funcional** que eu possa rodar aqui para reproduzir?

2. Como este módulo é "Pure Perl", eu não acredito na possibilidade de
ele ser o responsável pelo seu memory leak. Módulos "Pure Perl" estão
100% sob o controle do Perl, e se houver um memory leak você deveria
observar ele em outros lugares também. Eu recomendo que você procure por
módulos e dependências do seu módulo que não sejam Pure Perl e que
estejam embaixo da cadeia de chamadas do seu método get(). Isso vai te
dar uma idéia mais clara de onde está o problema.

3. Eu acho que foi o Nilson que chamou a atenção, mas o
HTML::TreeBuilder é problemático. Se voce estiver usando ele ou algum
ooutro HTML parser, eles podem ser os responsáveis pelo seu memory leak.

4. O pessoal da lista já sugeriu, e eu acho que é um bom work-around
para agora se você usar fork() e ler os resultados da sua coleta de
dados de um arquivo temporário (FIle::Temp) ou de um Named Pipe no disco.

  *  *  *

Aqui tem minha sugestõa de estratégia: use fork(), IO::Select, e
IO::Event; dispare processos com open() que escrevam dados de volta para
o seu programa (logue STDERR à parte).

Monitore os filehandles abertos para saber quem terminou (use IO::Select
e IO::Event para isso), leia os dados do filehandle quando for apropriado.

Depois de ler os dados do processo-filho de volta no processo principal,
certifique-se de que você chamou close() no filehandle (o Perl vai
chamar wait() e esperar que o processo-filho morra. O linux vai reclamar
 até mesmo a memória que você não pode mais alcançar).

Com isto, você talvez se livre do seu memory leak, e vai certamente
aumentar a velocidade das suas visitas.

Espero que isso ajude.

Boa sorte, e putamplexos!
-- 
Luis Motta Campos is a DBA,
Perl Programmer, foodie and photographer.


More information about the SaoPaulo-pm mailing list