跳转到主要内容

Lance列格式Python包装器

项目描述

Python绑定Lance数据格式

:warning: 正在积极开发

Lance Logo

Lance是一种用于数据科学和机器学习的新列式数据格式

为什么你应该使用Lance

  1. 在点查询和常见于DS/ML的嵌套数据结构方面,Lance的速度比Parquet快一个数量级
  2. 包含快速向量索引,提供亚毫秒级最近邻搜索性能
  3. 自动版本控制,支持溯源和时间旅行,实现完全可重复性
  4. 已与duckdb/pandas/polars集成。仅需两行代码即可轻松转换为/from parquet

快速开始

安装

pip install pylance

请确保您拥有最新版本的pandas(1.5+)、pyarrow(10.0+)和DuckDB(0.7.0+)

转换为Lance

import lance

import pandas as pd
import pyarrow as pa
import pyarrow.dataset

df = pd.DataFrame({"a": [5], "b": [10]})
uri = "/tmp/test.parquet"
tbl = pa.Table.from_pandas(df)
pa.dataset.write_dataset(tbl, uri, format='parquet')

parquet = pa.dataset.dataset(uri, format='parquet')
lance.write_dataset(parquet, "/tmp/test.lance")

读取Lance数据

dataset = lance.dataset("/tmp/test.lance")
assert isinstance(dataset, pa.dataset.Dataset)

Pandas

df = dataset.to_table().to_pandas()

DuckDB

import duckdb

# If this segfaults, make sure you have duckdb v0.7+ installed
duckdb.query("SELECT * FROM dataset LIMIT 10").to_df()

向量搜索

下载sift1m子集

wget ftp://ftp.irisa.fr/local/texmex/corpus/sift.tar.gz
tar -xzf sift.tar.gz

将其转换为Lance

import lance
from lance.vector import vec_to_table
import numpy as np
import struct

nvecs = 1000000
ndims = 128
with open("sift/sift_base.fvecs", mode="rb") as fobj:
    buf = fobj.read()
    data = np.array(struct.unpack("<128000000f", buf[4 : 4 + 4 * nvecs * ndims])).reshape((nvecs, ndims))
    dd = dict(zip(range(nvecs), data))

table = vec_to_table(dd)
uri = "vec_data.lance"
sift1m = lance.write_dataset(table, uri, max_rows_per_group=8192, max_rows_per_file=1024*1024)

构建索引

sift1m.create_index("vector",
                    index_type="IVF_PQ", 
                    num_partitions=256,  # IVF
                    num_sub_vectors=16)  # PQ

搜索数据集

# Get top 10 similar vectors
import duckdb

dataset = lance.dataset(uri)

# Sample 100 query vectors. If this segfaults, make sure you have duckdb v0.7+ installed
sample = duckdb.query("SELECT vector FROM dataset USING SAMPLE 100").to_df()
query_vectors = np.array([np.array(x) for x in sample.vector])

# Get nearest neighbors for all of them
rs = [dataset.to_table(nearest={"column": "vector", "k": 10, "q": q})      
      for q in query_vectors]

*更多距离度量、HNSW和分布式支持正在规划中

Python包详细信息

从PyPI安装:pip install pylance # >=0.3.0是新的基于Rust的实现

通过:import lance导入

Python集成是通过pyo3和自定义Python代码完成的

  1. 我们使用Rust为Dataset/Scanner/RecordBatchReader创建包装类,这些类暴露给Python。
  2. 然后,它们被用于LanceDataset / LanceScanner实现,这些实现扩展了pyarrow Dataset/Scanner以兼容DuckDB。
  3. 数据通过Arrow C数据接口传递

动机

我们为什么需要一个新的数据科学和机器学习格式?

1. 可重复性是必需的

版本控制和实验支持应内置到数据集中,而不是需要多个工具。
它还应该是高效的,不需要每次创建新版本时都进行昂贵的复制。
我们称这为Lance中的“零拷贝版本控制”。它使得版本控制数据变得容易,而不会增加存储成本。

2. 云存储现在是默认的

对于数据科学和机器学习,远程对象存储现在是默认的,而云的性能特性是根本不同的。
Lance格式针对云原生进行了优化。使用Lance比Parquet快一个数量级,特别是对于ML数据,常见的操作如过滤后取数据。

3. 向量必须是第一公民,而不是一个单独的东西

大多数合理的规模工作流程不应需要额外的复杂性和成本,仅为了计算向量相似性就需要专门的数据库。Lance将优化的向量索引集成到列式格式中,因此不需要额外的基础设施来获得低延迟的top-K相似度搜索。

4. 开放标准是必需的

DS/ML生态系统非常丰富,数据必须在不同的语言、工具和环境之间轻松访问。Lance将Apache Arrow集成作为其主接口,这意味着转换到/from只需要两行代码,转换后您的代码不需要更改,而且没有任何东西被锁定以强制您为供应商的计算付费。我们需要开源,而不是假开源。

项目详情


发布历史 发布通知 | RSS源

下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

此版本没有提供源代码分发文件。请参阅 生成分发存档 的教程。

构建分发

pylance-0.18.2-cp39-abi3-win_amd64.whl (28.1 MB 查看哈希值)

上传于 CPython 3.9+ Windows x86-64

pylance-0.18.2-cp39-abi3-manylinux_2_28_x86_64.whl (30.0 MB 查看哈希值)

上传于 CPython 3.9+ manylinux: glibc 2.28+ x86-64

pylance-0.18.2-cp39-abi3-manylinux_2_24_aarch64.whl (29.2 MB 查看哈希值)

上传于 CPython 3.9+ manylinux: glibc 2.24+ ARM64

pylance-0.18.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (30.1 MB 查看哈希值)

上传于 CPython 3.9+ manylinux: glibc 2.17+ x86-64

pylance-0.18.2-cp39-abi3-macosx_11_0_arm64.whl (26.3 MB 查看哈希值)

上传于 CPython 3.9+ macOS 11.0+ ARM64

pylance-0.18.2-cp39-abi3-macosx_10_15_x86_64.whl (28.3 MB 查看哈希值)

上传于 CPython 3.9+ macOS 10.15+ x86-64

由以下组织支持