From d0c62ea8b841e7c4dbd42b2a385dade8bd47f501 Mon Sep 17 00:00:00 2001 From: Marcio Mazza Date: Tue, 14 Nov 2017 12:04:54 -0200 Subject: [PATCH] =?UTF-8?q?Contorna=20vazamento=20de=20mem=C3=B3ria?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/exporta_zope/exporta_zope.py | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/sapl/legacy/scripts/exporta_zope/exporta_zope.py b/sapl/legacy/scripts/exporta_zope/exporta_zope.py index 2ac6eaad2..d8498266a 100755 --- a/sapl/legacy/scripts/exporta_zope/exporta_zope.py +++ b/sapl/legacy/scripts/exporta_zope/exporta_zope.py @@ -55,18 +55,28 @@ def dump_file(doc, path): fullname = os.path.join(path, name + extension) print(fullname) - pdata = br(doc['data']) + # A partir daqui usamos dict.pop('...') nos __Broken_state__ + # para contornar um "vazamento" de memória que ocorre + # ao percorrer a árvore de objetos + # + # Imaginamos que, internamente, o ZODB está guardando referências + # para os objetos Broken criados e não conseguimos identificar como. + # + # Essa medida descarta quase todos os dados retornados + # e só funciona na primeira passagem + + pdata = br(doc.pop('data')) if isinstance(pdata, str): # Retrocedemos se pdata ja eh uma str (necessario em Images) + doc['data'] = pdata pdata = doc with open(fullname, 'w') as arq: while pdata: - arq.write(pdata['data']) - pdata = br(pdata.get('next', None)) - return name - + arq.write(pdata.pop('data')) + pdata = br(pdata.pop('next', None)) + return name def enumerate_folder(folder):