Bỏ qua

Benchmarks

Kết quả từ một lần chạy demo.ipynb trên bộ 17 năm NYC TLC Yellow Taxi (2009 đến 2025, 204 file Parquet, 29.66 GB, 1,826,960,642 dòng). Máy Apple Silicon / macOS, uv run --no-sync maturin develop --release. Tùy phần cứng và cache, chỉ tham khảo.


1. Quy mô dữ liệu

Chỉ số Giá trị
Số file Parquet 204 (2009 đến 2025)
Số cột 20
Số dòng 1,826,960,642
Số ô 36,539,212,840
Dung lượng 29.66 GB (30,371.6 MB)

Đếm bằng pq.read_metadata + os.path.getsize trong notebook; quét khối lượng chỉ đọc metadata, không đọc toàn bộ dữ liệu.


2. Kiểm tra catalog (.br_map.bazan)

br.lake.create_map("data") lần đầu quét thư mục và tạo .br_map.bazan; load catalog đã lưu dùng memmap2. Một lần doctor đầy đủ vẫn discovery file và kiểm tra đường dẫn, dung lượng, thời gian sửa đổi để tìm drift catalog; phép so sánh này không dùng hash nội dung.

Chế độ Số file Thời gian (demo)
Cold (tạo mới) 204 ~18,068 ms
Warm (mmap, trung bình 5 lần) 204 ~0.5 ms

Mốc ~0.5 ms chỉ đo việc load catalog, không đo đọc dữ liệu hay kiểm tra mọi file. Mức tăng tốc phụ thuộc storage và việc map đã tồn tại hay chưa.


3. Lọc chất lượng toàn lake

br.filter.filter_files_parallel("data/yellow_tripdata_*.parquet", rules=[5 rule]), đọc song song + lọc Rayon.

Rule trong demo: passenger_count >= 1, trip_distance > 0.0, fare_amount > 0.0, total_amount > 0.0, total_amount <= 1000.0.

Tổng file : 204
Tổng dòng : 1,826,960,642
Clean     : 1,780,228,507
Trash     : 46,732,135
Thời gian : ~21.1 s (ExecuteTime 19:48:57.175 → 19:49:18.296)

Dòng trash mang audit_error_code (64 rule đầu dạng bitmask u64) và khi >64 rule có thêm audit_violated_rules (List<UInt32>).

Vòng lặp lọc là Rust thuần trên Arrow array do LLVM tự vector hóa; không phải intrinsic SIMD viết tay.


4. Thao tác trên một file

Một batch tháng (yellow_tripdata_2025-12.parquet, ~4,305,006 dòng) dùng cho demo SQL và slicing:

  • Cắt lát: notebook minh họa br.read.slice_rows(..., offset=0, limit=100) nhưng không đo riêng thời gian gọi đó. API có thể dùng locator trong map để bỏ qua block không liên quan; độ trễ tùy file và cache.
  • SQL: br.sql.execute_sql_stream("SELECT ... GROUP BY passenger_count"), aggregation trên một file xong ~0.1 s trong demo; bàn giao sang DuckDB qua duckdb.from_arrow(stream.to_pyarrow()) là truyền qua Arrow FFI.

Không so sánh với pandas/Postgres, kết quả phụ thuộc truy vấn và phần cứng.