diff --git a/pyiceberg/table/deletion_vector.py b/pyiceberg/table/deletion_vector.py index 9c56af24a2..d9bb52396a 100644 --- a/pyiceberg/table/deletion_vector.py +++ b/pyiceberg/table/deletion_vector.py @@ -51,27 +51,28 @@ def __init__(self, referenced_data_file: str, bitmaps: list[BitMap]) -> None: @staticmethod def _deserialize_bitmap(pl: bytes) -> list[BitMap]: number_of_bitmaps = int.from_bytes(pl[0:8], byteorder="little") - pl = pl[8:] + offset = 8 bitmaps = [] last_key = -1 + buffer = memoryview(pl) + for _ in range(number_of_bitmaps): - key = int.from_bytes(pl[0:4], byteorder="little") + key = int.from_bytes(buffer[offset : offset + 4], byteorder="little") if key < 0: raise ValueError(f"Invalid unsigned key: {key}") if key <= last_key: raise ValueError("Keys must be sorted in ascending order") if key > MAX_JAVA_SIGNED: raise ValueError(f"Key {key} is too large, max {MAX_JAVA_SIGNED} to maintain compatibility with Java impl") - pl = pl[4:] + offset += 4 while last_key < key - 1: bitmaps.append(EMPTY_BITMAP) last_key += 1 - bm = BitMap().deserialize(pl) - # TODO: Optimize this - pl = pl[len(bm.serialize()) :] + bm = BitMap.deserialize(buffer[offset:]) + offset += len(bm.serialize()) bitmaps.append(bm) last_key = key