Lance Format
Description
Lance is a modern columnar data format designed to optimize machine learning (ML) and data science workflows. It offers high-performance random access, efficient vector search capabilities, automatic versioning, and seamless integration with tools like Pandas, DuckDB, and Polars. Lance is built on Apache Arrow and provides faster point queries compared to traditional formats like Parquet.
File Extensions
.lance- Lance dataset (directory-based format)
Note: Lance datasets are stored as directories, not single files. When you specify a filename ending with .lance, the extension is removed to get the directory path.
Implementation Details
Reading
The Lance implementation:
- Uses the
lancePython library for reading - Opens Lance datasets as directories
- Supports batch reading for efficient iteration
- Preserves data types and schema
- Provides fast random access to data
Writing
Writing support:
- Buffers records before writing
- Uses
lance.write_dataset()for creating datasets - Supports multiple write modes: 'create', 'overwrite', 'append'
- Flushes data on close
- Maintains schema from data
Key Features
- Columnar format: Efficient for analytical and ML workloads
- Vector search: Built-in support for similarity search over embedding spaces
- Fast random access: Significantly faster point queries than Parquet
- Automatic versioning: Supports dataset versioning and time-travel capabilities
- High performance: Optimized for ML and data science workflows
- Totals support: Can count total rows efficiently
- Batch processing: Efficient batch reading and writing
- Type preservation: Maintains data types
Usage
from iterable import open_iterable
# Basic reading
source = open_iterable('data.lance')
for row in source:
print(row)
source.close()
# Writing with options
dest = open_iterable('output.lance', mode='w', iterableargs={
'batch_size': 10000,
'write_mode': 'create' # or 'overwrite', 'append'
})
dest.write({'id': 1, 'name': 'John', 'age': 30})
dest.close() # Important: closes and flushes data
# Bulk writing
dest = open_iterable('output.lance', mode='w')
records = [
{'id': 1, 'name': 'Alice', 'age': 25},
{'id': 2, 'name': 'Bob', 'age': 30},
{'id': 3, 'name': 'Charlie', 'age': 35}
]
dest.write_bulk(records)
dest.close()
Parameters
batch_size(int): Batch size for reading (default:1024)write_mode(str): Write mode for creating datasets (default:'create')'create': Creates a new dataset (raises error if exists)'overwrite': Creates a new snapshot version, replacing existing dataset'append': Appends new data to the latest version
Limitations
- Lance dependency: Requires
lancepackage (pip install lance) - Directory-based: Lance datasets are directories, not single files
- Flat data only: Designed for tabular/flat data structures
- Write buffering: Must call
close()to flush buffered data - PyArrow dependency: Requires
pyarrow(installed with lance)
Compression Support
Lance format has built-in compression and optimization. Note that Lance datasets are directories, so file-level compression codecs (like .gz) are not applicable in the same way as single-file formats.
Performance Considerations
- Fast random access: Lance provides significantly faster point queries than Parquet
- Vector search: Built-in support for efficient similarity search
- Batch size: Larger batch sizes improve iteration performance
- Memory efficiency: Optimized for large-scale ML workflows
- Versioning: Automatic versioning enables time-travel queries
Use Cases
- Machine learning: Optimized format for ML data pipelines
- Vector search: Similarity search over embedding spaces
- Data science: High-performance data processing workflows
- Analytics: Fast columnar data access with random access capabilities
- Data versioning: Automatic versioning for reproducible ML experiments
Related Formats
- Parquet - Similar columnar format (Lance is faster for random access)
- Arrow - In-memory columnar format (Lance is built on Arrow)
- ORC - Another columnar format
Installation
To use Lance format, install the required package:
pip install lance
The lance package includes pyarrow as a dependency, so you don't need to install it separately.