Blob 作为文件

与其他数据格式不同,大规模多模态数据在Lance列式存储格式中是一等公民。Lance提供了高级API来存储和检索Lance数据集中的大型二进制对象(blobs)。

_images/blob.png

Lance通过lance.BlobFile处理大型二进制数据,这是一个类文件对象,能够延迟读取大型二进制对象。

要创建一个包含大型二进制数据(BLOB)的Lance数据集,您可以通过将元数据lance-encoding:blob设置为true来将大型二进制列标记为BLOB列。

import pyarrow as pa

schema = pa.schema(
    [
        pa.field("id", pa.int64()),
        pa.field("video",
            pa.large_binary(),
            metadata={"lance-encoding:blob": "true"}
        ),
    ]
)

要从Lance数据集中获取二进制大对象(blobs),可以使用lance.dataset.LanceDataset.take_blobs()

例如,使用BlobFile可以轻松从视频文件中提取帧,而无需将整个视频加载到内存中。

# pip install av pylance

import av
import lance

ds = lance.dataset("./youtube.lance")
start_time, end_time = 500, 1000
blobs = ds.take_blobs([5], "video")
with av.open(blobs[0]) as container:
    stream = container.streams.video[0]
    stream.codec_context.skip_frame = "NONKEY"

    start_time = start_time / stream.time_base
    start_time = start_time.as_integer_ratio()[0]
    end_time = end_time / stream.time_base
    container.seek(start_time, stream=stream)

    for frame in container.decode(stream):
        if frame.time > end_time:
            break
        display(frame.to_image())
        clear_output(wait=True)