def METHOD_NAME(header: Mapping, gds=False) -> list:
    """Read frames from disk
    Parameters
    ----------
    header: Mapping
        The metadata of the frames to read
    gds: bool
        Enable the use of GPUDirect Storage. Notice, this must
        match the GDS option set by the prior `disk_write()` call.
    Returns
    -------
    frames: list
        List of read frames
    """
    ret: list = [
        get_new_cuda_buffer()(length)
        if gds and is_cuda
        else np.empty((length,), dtype="u1")
        for length, is_cuda in zip(header["frame-lengths"], header["cuda-frames"])
    ]
    if gds:
        import kvikio  # isort:skip
        with kvikio.CuFile(str(header["path"]), "r") as f:
            # Read each frame consecutively from `path` in parallel
            file_offsets = itertools.accumulate((b.nbytes for b in ret), initial=0)
            futures = [f.pread(b, file_offset=o) for b, o in zip(ret, file_offsets)]
            for each_fut in futures:
                each_fut.get()
    else:
        with open(str(header["path"]), "rb") as f:
            os.readv(f.fileno(), ret)  # type: ignore
    return ret