Procurei no histórico da lista, e no google, sobre como criar uma
aplicação em python que possa permanecer rodando indefinidamente sem
aumentar seu uso de memória. Vi que em alguns sistemas operacionais,
as restrições do módulo 'resource' são honradas, mas infelizmente não
é o caso do Linux. Uma das opções, proposta nesta lista, foi a
utilização de um módulo monitor que reiniciaria a aplicação quando o
consumo ultrapassasse um certo limiar. Gostaria de saber se existe uma
alternativa a isso, de preferência que não necessitasse desse reset.
Descrevendo melhor minha situação.
Minha aplicação faz parsing (mechanize, BeautifulSoup) de uma página
html de tempos em tempos e guarda em disco (sqlite3) algumas
informações. O processo inicia com um consumo de pouco mais de 15mb.
Em algumas horas isso sobe para +20mb. Em alguns dias cheguei a
observar um consumo de 60mb.
Estou utilizando o guppy.heap() para verificar o quê está consumindo
essa memória, e não vejo nada anormal. str, tuple, dict, type,
function são responsáveis por 85% do consumo de memória, e essa
proporção é constante.
Verifico o consumo de memória por meio do aplicativo top, do linux,
onde verifico as memórias consumida (RES), 'swapped out' (SWAP) e o
tamanho dos dados do aplicativo (DATA).
Alguma dica ou sugestão para evitar que a memória consumida aumente?
Og!
------------------------------------
,-----------------------------------------------------------.
| Antes de enviar um e-mail para o grupo leia: |
| http://www.pythonbrasil.com.br/moin.cgi/AntesDePerguntar |
| E se você é usuário do BOL lembre-se de cadastrar o |
| e-mail do grupo na lista branca do seu sistema anti-spam. |
`-----------------------------------------------------------´Links do Yahoo! Grupos
<*> Para visitar o site do seu grupo na web, acesse:
http://br.groups.yahoo.com/group/python-brasil/
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@yahoogrupos.com.br
<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
http://br.yahoo.com/info/utos.html
*import* gc
gc.collect()
--
"A arrogância é a arma dos fracos."
===========================
Italo Moreira Campelo Maia
Ciência da Computação - UECE
Desenvolvedor WEB e Desktop (Java, Python)
Mestrando UECE
-----------------------------------------------------
http://www.italomaia.com/
http://twitter.com/italomaia/
http://eusouolobomau.blogspot.com/
-----------------------------------------------------
turtle linux 910 - http://tiny.cc/blogturtle910
===========================
[As partes desta mensagem que não continham texto foram removidas]
1) Mechanize ou BeautifulSoup estão acumulando memória (isto é normal em
módulos em que existem árvores de dados, pois podem ocorrer referências
cíclicas entre nodos), já ouvi falar que o BeautifulSoup tinha problemas com
isto;
2) Você não está realizando o commit no sqlite3, isto faz com que ele vá
acumulando na memória os dados que serão persistidos (acredito que dê para
alterar esse sistema de journal dele, mas não sem perder performance), o
ideal seria fazer isto de tempo em tempo dependendo da tua aplicação;
3) Na sua aplicação, algo está sendo mantido em memória, verifique por
variáveis de escopo global ou algo assim, se você está referenciando algo, o
garbage collector do Python não vai liberar a memória mesmo, tente resolver
o problema removendo elas ou usando weak references [1].
4) Verifique se você está usando alguma outra extension que esteja causando
memory leak;
Sem conhecer a aplicação é difícil lhe dar uma causa precisa disto.
[1] http://docs.python.org/library/weakref.html
2010/6/5 Italo Maia <italo...@gmail.com>
--
"Forgive, O Lord, my little jokes on Thee, and I'll forgive Thy great big
joke on me."
http://pyevolve.sourceforge.net/wordpress/
>
>
> Pessoal,
>
> Procurei no histórico da lista, e no google, sobre como criar uma
> aplicação em python que possa permanecer rodando indefinidamente sem
> aumentar seu uso de memória. Vi que em alguns sistemas operacionais,
> as restrições do módulo 'resource' são honradas, mas infelizmente não
> é o caso do Linux. Uma das opções, proposta nesta lista, foi a
> utilização de um módulo monitor que reiniciaria a aplicação quando o
> consumo ultrapassasse um certo limiar. Gostaria de saber se existe uma
> alternativa a isso, de preferência que não necessitasse desse reset.
>
> Descrevendo melhor minha situação.
>
> Minha aplicação faz parsing (mechanize, BeautifulSoup) de uma página
> html de tempos em tempos e guarda em disco (sqlite3) algumas
> informações. O processo inicia com um consumo de pouco mais de 15mb.
> Em algumas horas isso sobe para +20mb. Em alguns dias cheguei a
> observar um consumo de 60mb.
>
> Estou utilizando o guppy.heap() para verificar o quê está consumindo
> essa memória, e não vejo nada anormal. str, tuple, dict, type,
> function são responsáveis por 85% do consumo de memória, e essa
> proporção é constante.
>
> Verifico o consumo de memória por meio do aplicativo top, do linux,
> onde verifico as memórias consumida (RES), 'swapped out' (SWAP) e o
> tamanho dos dados do aplicativo (DATA).
>
> Alguma dica ou sugestão para evitar que a memória consumida aumente?
>
dá um olhada na lib "psutil" [1] caso queira monitorar o uso de memória de
um processo.
[1] - http://code.google.com/p/psutil/
>
> Og!
>
>
--
Gabriel M. Monnerat
[As partes desta mensagem que não continham texto foram removidas]
------------------------------------
Todas as infomações que preciso guardar são armazenadas no sqlite3,
não em memória. Eu coloquei uma chamada ao gc.collect() a cada
iteração e ainda assim o consumo de memória aumenta. :/
Og!
Parece que encontrei o ponto de 'vazamento': era o histórico de
navegação do objeto mechanize.Browser. A resolução para isso encontrei
aqui [1]. Desde então o consumo de memória oscilando entre 19 e 21mb,
o que já está bom para mim.
Valeu pelas dicas, pessoal. Vou passar a usar o psutil que o Gabriel
sugeriu. Segui a sugestão do Italo de chamar explicitamente o GC. O
que aconteceu é que esse intervalo de oscilação ficou mais enxuto (que
foi o valor que reportei). Vou experimentar rodar o programa por uns
dias com e sem pra ver como fica. Segui o check-list que o Christian
sugeriu também.
[1] http://stackoverflow.com/questions/2393299/how-do-i-disable-history-in-python-mechanize-module
Og!
Abraços,
Uilton Dutra
http://www.uilton.com
2010/6/5 Christian S. Perone <christia...@gmail.com>