XML, который я пытаюсь разобрать, довольно большой (> 100 ГБ).Я удалил элемент в каждой итерации, а также удалил корневой элемент.Тем не менее, происходит утечка памяти, которая становится значительной (более 200-300 МБ), когда файл довольно большой.
Структура XML выглядит следующим образом:
<source>
<items>
<item>
<id></id>
<title></title>
<category></category>
<city></city>
</item>
.
.
.
.
<item>
<id></id>
<title></title>
<category></category>
<city></city>
</item>
</items>
</source>
Мой код:
from urllib.request import urlopen
import gzip
from lxml import etree
import csv
response = urlopen(url)
response_headers = response.info()
if response_headers.get('Content-Encoding') == 'gzip' or 'gzip' in response_headers.get('Content-Type'):
response = gzip.GzipFile(fileobj=response)
context = etree.iterparse(response, events=("start", "end"))
context = iter(context)
_, root = next(context)
_, items_root = next(context)
try:
for event, item in context:
if event == "end" and item.tag == "item":
title = item.find('title').text
category = item.find('category').text
city = item.find('city').text
item.clear()
items_root.clear()
root.clear()
except Exception as e:
raise (e)
Раньше я просто очищал item
и root
, но позжеЯ подумал, что items
имеет много пустых item
, что приводит к утечке памяти.Но даже после добавления проблема не решается.