想象你只想从十亿条记录里取出一条,却得搬来一大箱数据,再查一张巨大的位置表。Parquet——把同一列数据集中存放的文件格式——很擅长报表式批量扫描,但向量检索、机器学习数据集常要随机读取少量记录,这正是Lance想解决的问题。
TonTinTon援引Lance论文称,把Parquet页面调到8KB并关闭部分功能后,随机访问可快逾60倍,整列扫描也没有变慢;parquet-rs调优前后更从每秒5,500行升到35万行。不过,小页面会让页面数量暴涨,而Parquet需要在内存里保存每页的位置。文章用十亿条、每条3KB的向量举例:1MB页面约需60MB索引,但单行读取会多读约341倍;8KB页面把浪费降至约2.7倍,索引却膨胀到约20GB。
这就是Lance不满足于“调优Parquet”的原因:它对大值不保留页面索引,而把同一行在某列中的内容连续摆放,用计算直接定位。换句话说,它改的是底层布局,试图绕开随机读取、内存和多读数据之间无法靠参数消除的冲突。文中数字主要用于量级直觉,且部分测试基于本地NVMe,放到S3一类对象存储上可能不同。