vazamento de memória no ZODB

10 views
Skip to first unread message

Flavio Coelho

unread,
Dec 3, 2007, 2:13:44 PM12/3/07
to grok-br
eu observei um comportamento estranho no ZODB

se eu abrir um banco grande e fizer um loop nele, lendo algum
atributo de todos os objetos num OOBTree, por exemplo, eu nunca mais
consigo tirar liberar a memória ocupada pelo carregamento destes
objetos...., mesmo deletando a conexão!!

seria algo assim:

from ZODB import FileStorage, DB

storage = FileStorage.FileStorage('rawdb.fs')
db = DB(storage)
zconn = self.db.open()
zroot = zconn.root()

#zroot['objetcs'] e uma OOBTree

[obj for obj in zroot['objects'].itervalues()]

Este ultimo loop traz todos os objetos para a memória e mesmo a lista
resultante não estando associada a nenhuma variável, a memória nunca
mais é liberada...

Alguém já viu isso? como eu resolvo isso?

já tentei até o gc.collect() sem sucesso!!

FLávio

P.S. no meu exemplo eu estou usando zeo.ClientStorage ao invés do
FileStorage

Leonardo Rochael Almeida

unread,
Dec 3, 2007, 2:33:07 PM12/3/07
to gro...@googlegroups.com
Programas Unix (e também Windows, se não me engano), dificilmente
"devolvem" memória pro sistema operacional. Quando eles não estão mais
usando um trecho de memória, este trecho fica num reservatório de
memória sob o controle da biblioteca C dentro do espaço do próprio
processo.

Se você quer determinar se há de fato vazamento de memória em um um
trecho de código, coloque este código pra executar continuamente e
monitore a memória. Se o consumo de memória daquele programa
estabilizar depois de um tempo, sem consumir mais memória, ele não tem
vazamento. Se por outro lado ele continuar pegando mais e mais memória
do sistema, o trecho tem vazamento.

Mas você dificilmente vai ver a quantidade de memória usada pelo
processo diminuindo, a não ser quando o processo morre.

Abraços, Leo

Flavio Coelho

unread,
Dec 4, 2007, 4:18:14 AM12/4/07
to grok-br
Oi Leo,

Realmente não se trata de um vazamento contínuo de memória, apenas um
mau gerenciamento. Afinal a função dos garbage collectors é
justamente, liberar memória previamente alocada para variáveis que não
estão mais em uso, de forma que o programa não coma toda a memória do
sistema.

Se eu não posso varrer os objetos de um banco ZODB, sem que estes
objetos sejam removidos da memória quando saem de "cena", isto é um
problema sério. Sei que não adianta reclamar para você...;-) Só
comentei aqui para saber se alguem já havia passado por isso.

Sei que pouca gente usa o ZODB stand-alone como eu, e se vc "forka" um
processo para cada conexão, não vai ter este problema. Mesmo assim eu
preciso varrer todos os objetos em uma única conexão e meu processo
esta comendo 1.4GB!!!

Bem, é isso, acho que vou relatar isso na lista de ZODB (se existir
uma...).

Abraço e obrigado!

Flávio

On Dec 3, 5:33 pm, "Leonardo Rochael Almeida" <leoroch...@gmail.com>
wrote:
> Programas Unix (e também Windows, se não me engano), dificilmente
> "devolvem" memória pro sistema operacional. Quando eles não estão mais
> usando um trecho de memória, este trecho fica num reservatório de
> memória sob o controle da biblioteca C dentro do espaço do próprio
> processo.
>
> Se você quer determinar se há de fato vazamento de memória em um um
> trecho de código, coloque este código pra executar continuamente e
> monitore a memória. Se o consumo de memória daquele programa
> estabilizar depois de um tempo, sem consumir mais memória, ele não tem
> vazamento. Se por outro lado ele continuar pegando mais e mais memória
> do sistema, o trecho tem vazamento.
>
> Mas você dificilmente vai ver a quantidade de memória usada pelo
> processo diminuindo, a não ser quando o processo morre.
>
> Abraços, Leo
>

xiru

unread,
Dec 4, 2007, 8:04:32 AM12/4/07
to gro...@googlegroups.com
On Dec 4, 2007 7:18 AM, Flavio Coelho <fcco...@gmail.com> wrote:
>
> Oi Leo,
>
> Realmente não se trata de um vazamento contínuo de memória, apenas um
> mau gerenciamento. Afinal a função dos garbage collectors é
> justamente, liberar memória previamente alocada para variáveis que não
> estão mais em uso, de forma que o programa não coma toda a memória do
> sistema.
>
> Se eu não posso varrer os objetos de um banco ZODB, sem que estes
> objetos sejam removidos da memória quando saem de "cena", isto é um
> problema sério. Sei que não adianta reclamar para você...;-) Só
> comentei aqui para saber se alguem já havia passado por isso.

Isso é assim mesmo; tanto é que no Zope, quando você tem que fazer
algo semelhante, é indicado que você use o ZCatalog (e no Plone, o
portal_catalog). Usando um catalogo de objetos, você consegue "varrer"
ponteiros para os objetos sem colocar os objetos propriamente ditos
integralmente na memória.

>
> Sei que pouca gente usa o ZODB stand-alone como eu, e se vc "forka" um
> processo para cada conexão, não vai ter este problema. Mesmo assim eu
> preciso varrer todos os objetos em uma única conexão e meu processo
> esta comendo 1.4GB!!!
>

Bem, como você ta fazendo isso "na raça", acho que a única solução é
você pensar uma estrutura de dados que sumarize aquilo que você
realmente precisa obter ao varrer os objetos. Essa estrutura poderia
ser uma lista persistente de tuplas, por exemplo, onde uma das
posições dessa tuple seria um apontador para o objeto real, caso você
precise coloca-lo em memória.

Rasteiramente falando, é exatamente isso que o ZCatalog faz,
implementa uma estrutura de dados de indices e metadata para permitir
que voce varra o conteudo do ZODB sem ficar percorrendo objeto por
objeto, justamente para não ter que colocar tudo em memória.

--
Fabiano Weimar dos Santos (xiru)
Weimar Consultoria

Hospedagem Plone, Zope e Python
http://www.pytown.com

Fernando Correa Neto

unread,
Dec 4, 2007, 1:36:26 PM12/4/07
to gro...@googlegroups.com
Opa

[snip]

>
> Bem, como você ta fazendo isso "na raça", acho que a única solução é
> você pensar uma estrutura de dados que sumarize aquilo que você
> realmente precisa obter ao varrer os objetos. Essa estrutura poderia
> ser uma lista persistente de tuplas, por exemplo, onde uma das
> posições dessa tuple seria um apontador para o objeto real, caso você
> precise coloca-lo em memória.

O Johan Dahlin tinha feito algo para o ZODB que se chamava
IndexedCatalog [1]. Mas isso faz um tempo já e não sei se está
funcionando.

[]'s
Fernando

[1] http://www.async.com.br/projects/indexedcatalog

Flavio Coelho

unread,
Dec 5, 2007, 8:48:55 AM12/5/07
to grok-br
OK,

vou dar uma investigada!

obrigado!

Flávio

Flavio Coelho

unread,
Dec 5, 2007, 9:35:31 AM12/5/07
to grok-br
Humm... Obrigado pela informação Fabiano.

vou dar uma investigada no Zcatalog e ver se resolve meu problema,
isto, se ele puder ser utilizado sem o resto do ZOPE

O ZODB é um excelente banco mas infelizmente peca pela falta de uma
documentação melhor e de uma comunidade interessanda em usá-lo como
banco sozinho...

Abcs,

Flávio

On Dec 4, 11:04 am, xiru <xirumacan...@gmail.com> wrote:
Reply all
Reply to author
Forward
0 new messages