Очевидно, что вам нужно избегать построения целого дерева (DOM или Etree или чего-либо еще) в памяти.Но лучший способ зависит от источника ваших данных и от того, насколько сложна и взаимосвязана структура вашего вывода.
Если он большой, потому что в нем тысячи экземпляров довольно независимых элементов, вы можете сгенерировать внешнюю оболочку., а затем построить деревья для каждого элемента и затем сериализовать каждый фрагмент в выходной.
Если фрагменты не настолько независимы, вам нужно будет провести дополнительную бухгалтерию - например, управлять базой данных сгенерированных идентификаторов и идентификаторов.
Я бы разбил его на 2 или 3 части: производитель событий саксофона, выходной сериализатор, использующий события саксофона, и, если нужно, проще работать с некоторыми независимыми частями, такими как объекты или деревья, что-то, чтобы построить ихобъекты, а затем превратить их в события саксофона для сериализатора.
Возможно, вы могли бы просто управлять всем этим как прямым выводом текста, вместо того, чтобы иметь дело с саксофонными событиями: это зависит от того, насколько это сложно.
Это также может быть хорошим местом для использования генераторов Python в качестве способа потоковой передачи выходных данных без необходимости создания больших структур в памяти.