Предотвращение утечки памяти при разборе гигантского XML с помощью etree - PullRequest
0 голосов
/ 25 октября 2018

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, что приводит к утечке памяти.Но даже после добавления проблема не решается.

...