Seguindo o link do mantovani <a href="http://www.perl-community.de/bat/poard/thread/14778">http://www.perl-community.de/bat/poard/thread/14778</a> , e se você olhar no perldoc também vai fazer<br>O modulo é alpha, então isso pode acontecer, se isso for uma coisa critica para sua aplicação escolhe outro modulo, ou manda um patch pro cara :D<br>
<br><br><br><div class="gmail_quote">2010/4/16 Andre Carneiro <span dir="ltr"><<a href="mailto:andregarciacarneiro@gmail.com">andregarciacarneiro@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br><br><div class="gmail_quote">Em 16 de abril de 2010 15:47, Daniel de Oliveira Mantovani <span dir="ltr"><<a href="mailto:daniel.oliveira.mantovani@gmail.com" target="_blank">daniel.oliveira.mantovani@gmail.com</a>></span> escreveu:<div>
<div></div><div class="h5"><br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div>2010/4/16 Andre Carneiro <<a href="mailto:andregarciacarneiro@gmail.com" target="_blank">andregarciacarneiro@gmail.com</a>>:<br>
</div><div><div></div><div>> Bom dia !<br>
><br>
> Estou fazendo um spider e estou tendo problemas para retirar o objeto<br>
> WWW::Scripter da memória.<br>
><br>
> Esse módulo é bem interessante para evitar que você tenha que estudar o<br>
> Javascript que o 'brilhante' designer fez e devolve a saída desse Javascript<br>
> em formato HTML. Até aí, tudo bem! Funciona! Maravilha!<br>
><br>
> O problema é que eu preciso que isso funcione em um spider onde eu tenho<br>
> várias iterações com esse objeto, e para cada 'get' que ele faz em cima de<br>
> uma página, ele reserva um novo espaço na memória que não libera nunca.<br>
><br>
> Lendo a documentação, eu vi que existe um método 'clear_history', mas<br>
> aparentemente não serve para isso que eu estou querendo. Tentei forçar uma<br>
> chamada para DESTROY, mas também não está funcionando. Abaixo tem um<br>
> segmento de código que pode ajudar vocês a me ajudarem.<br>
><br>
> <code><br>
> .<br>
> .<br>
> .<br>
> my $scripter = WWW::Scripter->new;<br>
> $scripter->use_plugin('JavaScript');<br>
> $scripter->max_history(1);<br>
> while(defined($tree)){<br>
> my @products =<br>
> $tree->findnodes("/html/body/div[\@id='container']/div[\@id='geral']/center/div[\@id='centro']/div[\@id='centro2_int']/div[\@id='produtos-vitrine']/div");<br>
><br>
> print "\n\n#################################ACHEI " . @products .<br>
> "PRODUTOS!\n\n";<br>
> foreach my $p(@products){<br>
> if($p){<br>
> print "\n\n" . $p->as_HTML;<br>
> #link/imagem<br>
> my ($prelink) = $p->findnodes('a');<br>
> if($prelink) {<br>
> my $u = $prelink->attr('href');<br>
> $u = decode_entities($u);<br>
> $self->product->url_original($u);<br>
> $self->product->url($self->product->url_original.<br>
> '&frompartner=3212');<br>
> my $preimg = $prelink->look_down(_tag => 'img');<br>
> if($preimg){<br>
> $self->product->imagem($preimg->attr('src'));<br>
> }<br>
><br>
> #Capturando detalhes<br>
> # print "\n\nURL: " . $self->product->url_original .<br>
> "\n\n";<br>
> eval{$self->agent->get($self->product->url_original)};<br>
> if($self->agent->success){<br>
> $scripter->get($self->product->url_original);<br>
> my $dtree =<br>
> HTML::TreeBuilder::XPath->new_from_content($self->agent->content);<br>
<br>
</div></div> Você colocou o $scripter->clear_history aqui ?<br>
<div><br>
<br>
> $self->get_detail($dtree , $scripter);<br>
> }else {<br>
> .<br>
> .<br>
> .<br>
> }<br>
> .<br>
> .<br>
> .<br>
> }<br>
> }<br>
><br>
> </code><br>
><br>
<br>
</div>Como você só colocou um pedaço do código, não da para saber, o final.<br>
Você percebeu que você está iniciando um objeto TreeBuilder a cada<br>
iteração do laço que o request é realizado com sucesso, você está<br>
fazendo $dtree->delete ?<br>
<br></blockquote></div></div><div><br>O pedaço do código que eu coloquei é suficiente para ver como o treco está sendo usado entre as iterações. Não precisa de mais nada além daquilo. Além do mais eu isolei essa mesma parte no MEU código para poder observar e ainda sim continua acumulando o alocação de memória, ou seja, não está liberando a memória.<br>
</div><div class="im"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
O módulo não tem nenhum "Report Bug", se fosse problema do módulo de<br>
estourar a memória, com certeza alguém já teria reportado.<br>
<br>
<br></blockquote></div><div><br>Pode ser então que eu seja o primeiro a fazer um! :D <br> <br></div><div class="im"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Por tanto, se você ler na documentação tem um atributo chamado:<br>
max_docs, por favor quando você iniciar o objeto, mude-o para 1<br>
<br></blockquote></div><div><br>Eu já vi esses atributos e continua não liberando memória... :D<br><br> </div><div class="im"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
my $script = WWW::Scripter->new(max_docs => 1, max_history => 1)<br>
<br>
"The maximum number of document objects to keep in history (along with<br>
their corresponding request and response objects). If this is omitted,<br>
Mech's stack_depth + 1 will be used. This is off by one because<br>
stack_depth is the number of pages you can go back to, so it is one<br>
less than the number of recorded pages. max_docs considers 0 to be<br>
equivalent to infinity."<br>
<br></blockquote><div></div></div><div><br>Boa! Mas eu já tinha testado isso, e continua não liberando memória
mesmo assim.<br>Mas é um bom lugar pra começar a fuçar no código...<br><br> </div><div class="im"><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
Isso não é nada mais do que o atributo, "stack_depth" do Mechanize que<br>
guarda os históricos do get, se não me falhe minha memória.<br>
<a href="http://search.cpan.org/%7Esprout/WWW-Scripter-0.010/lib/WWW/Scripter.pod" target="_blank">http://search.cpan.org/~sprout/WWW-Scripter-0.010/lib/WWW/Scripter.pod</a><br>
<br>
Estou esperando, para saber se agora funcinona, ok!<br>
<br></blockquote><br></div>Acho que isso não vai rolar tão cedo... de qq forma obrigado!<br><br><br>Cheers!<br><div> <br></div></div>-- <br><div><div></div><div class="h5">André Garcia Carneiro<br>Analista/Desenvolvedor Perl<br>
(11)82907780<br>
</div></div><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" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br></blockquote></div><br><br clear="all"><br>-- <br>lorn at lornlab dot org<br>Lindolfo "Lorn" Rodrigues<br>
<br>