From 67c415ef027c06d394562f880cee9ad5a7940df5 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Thu, 28 May 2026 01:03:59 +0000 Subject: [PATCH] Optimize memory usage during NZB parsing by clearing ET root element When parsing large NZB files with ET.iterparse, clearing leaf elements isn't enough. We must also clear the root element to prevent a memory leak where parent elements are retained. This reduces peak memory usage on a large NZB testbed from ~160MB to ~0.2MB. Co-authored-by: xbmc4lyfe <273732874+xbmc4lyfe@users.noreply.github.com> --- __pycache__/verify_nzb.cpython-312.pyc | Bin 0 -> 51490 bytes .../test_verify_nzb.cpython-312.pyc | Bin 0 -> 43266 bytes verify_nzb.py | 26 +++++++++++++----- 3 files changed, 19 insertions(+), 7 deletions(-) create mode 100644 __pycache__/verify_nzb.cpython-312.pyc create mode 100644 tests/__pycache__/test_verify_nzb.cpython-312.pyc diff --git a/__pycache__/verify_nzb.cpython-312.pyc b/__pycache__/verify_nzb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64bc6ba4e5479340a1e18389454dd4842ed8f627 GIT binary patch literal 51490 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 literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_verify_nzb.cpython-312.pyc b/tests/__pycache__/test_verify_nzb.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26c04fca391938b39dd87ce24da57cc2744ca637 GIT binary patch literal 43266 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 str: def parse_nzb_message_ids(path: str | Path) -> Iterator[str]: """Yield message IDs from elements in an NZB file.""" + # We track start and end events to clear the root element and avoid memory leaks + # when processing extremely large NZB files. with open(path, "rb") as handle: - for event, elem in ET.iterparse(handle, events=("end",)): - if _local_name(elem.tag) != "segment": - continue - text = (elem.text or "").strip() - if text: - yield text - elem.clear() + context = ET.iterparse(handle, events=("start", "end")) + context = iter(context) + try: + _, root = next(context) + except StopIteration: + return + + for event, elem in context: + if event == "end": + local_name = _local_name(elem.tag) + if local_name == "segment": + text = (elem.text or "").strip() + if text: + yield text + elem.clear() + if local_name == "file": + root.clear() def normalize_message_id(message_id: str) -> str: