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):