[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