From 731f43235e892dc0c715475055bb135c2e232c75 Mon Sep 17 00:00:00 2001 From: Matthew Stanley <1379tech@gmail.com> Date: Sat, 18 Jul 2026 06:30:37 -0700 Subject: [PATCH] tools: make large disc reads linear --- tools/extract_overlays.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/extract_overlays.py b/tools/extract_overlays.py index 0ad3804a..3558181f 100644 --- a/tools/extract_overlays.py +++ b/tools/extract_overlays.py @@ -65,10 +65,12 @@ class DiscReader: def read_file_bytes(self, lba, size): """Read exactly `size` bytes starting at `lba`.""" sectors_needed = (size + SECTOR_DATA - 1) // SECTOR_DATA - data = b'' - for i in range(sectors_needed): - data += self.read_sector_data(lba + i) - return data[:size] + # Do not repeatedly append to an immutable bytes object: large archive + # files (MMX6's ROCK_X6.DAT is ~51 MB / ~25k sectors) turn that into an + # O(n^2) copy loop. Accumulate references and copy the payload once. + chunks = [self.read_sector_data(lba + i) + for i in range(sectors_needed)] + return b''.join(chunks)[:size] # --------------------------------------------------------------------------- # CUE parser — extracts BIN path and track mode