
Nếu bạn vẫn đang dùng Pandas để biến đổi dữ liệu nhiều gigabyte trong Python, bạn đang phải trả một "thuế Pandas" khổng lồ: thực thi CPU đơn luồng, sao chép bộ nhớ tức thì, và phình to bộ nhớ đòi hỏi RAM gấp 5 đến 10 lần kích thước tập dữ liệu thô trước khi báo lỗi OutOfMemoryError.
Trong các pipeline dữ liệu hiện đại, Polars và DuckDB đã thay thế Pandas trở thành bộ công cụ tiêu chuẩn cho phân tích hiệu suất cao trên một node. Cả hai đều tận dụng lưu trữ theo cột, thực thi SIMD vector hóa, và Apache Arrow, mang lại tốc độ nhanh hơn 10 đến 50 lần trong khi xử lý các tập dữ liệu lớn hơn RAM vật lý.
Dưới đây là cách chúng hoạt động, cách chúng so sánh, và cách sử dụng chúng cùng nhau trong môi trường sản xuất.
Dataset on Disk (Parquet/CSV): 2.0 GB
Pandas in RAM: 12.0 GB - 18.0 GB (Peak during merge/groupby)
Polars in RAM: 2.3 GB (Zero-copy Arrow + streaming)
DuckDB in RAM: 0.8 GB (Chunked vectorized execution engine)
Pandas được thiết kế vào năm 2008 xoay quanh các mảng NumPy 1D. Nó có ba nút thắt cổ chai cơ bản:
NaN sang float64, làm tăng gấp đôi mức sử dụng bộ nhớ.Polars được viết lại từ đầu bằng Rust và được xây dựng trực tiếp trên định dạng bộ nhớ cột Apache Arrow. Nó xử lý dữ liệu bằng cách sử dụng tất cả các lõi CPU có sẵn mà không bị hạn chế bởi Python GIL.
Trong môi trường sản xuất, bạn hầu như luôn nên sử dụng API Lazy của Polars (LazyFrame). Thay vì chạy các phép tính ngay lập tức, Polars xây dựng một Kế hoạch Logic, tối ưu hóa nó (predicate pushdown, projection pushdown, slice pushdown), và thực thi nó song song:
import polars as pl
# Construct lazy query plan - zero disk I/O occurs here
lazy_query = (
pl.scan_parquet("s3://analytics-bucket/events/*.parquet")
.filter(pl.col("timestamp") >= pl.date(2026, 1, 1))
.filter(pl.col("event_type").is_in(["purchase", "subscription"]))
.with_columns([
(pl.col("amount_cents") / 100.0).alias("amount_usd"),
pl.col("user_id").n_unique().over("country").alias("unique_users_per_country")
])
.group_by(["country", "event_type"])
.agg([
pl.col("amount_usd").sum().alias("total_revenue"),
pl.col("amount_usd").mean().alias("avg_order_value"),
pl.len().alias("transaction_count")
])
.sort("total_revenue", descending=True)
)
# Inspect the optimized query plan
print(lazy_query.explain())
# Execute optimized plan in parallel across all CPU cores
result_df = lazy_query.collect(streaming=True)
print(result_df)
Khi bạn gọi .scan_parquet() với các bộ lọc:
timestamp >= 2026-01-01 mà không đọc dữ liệu từ đĩa.timestamp, event_type, amount_cents, country), bỏ qua 50 cột còn lại trong tệp.streaming=True): Xử lý dữ liệu theo các micro-batch streaming, cho phép biến đổi trên các tập dữ liệu vượt quá RAM vật lý của máy bạn.Trong khi Polars cung cấp API DataFrame, DuckDB là một cơ sở dữ liệu OLAP SQL nhúng trong tiến trình. Nó chạy bên trong tiến trình Python của bạn mà không có bất kỳ phụ thuộc máy chủ bên ngoài nào, không có độ trễ mạng, và hỗ trợ ngôn ngữ SQL gốc.
DuckDB có thể thực thi các truy vấn SQL trực tiếp trên các tệp Parquet, CSV, hoặc JSON đã nén trên đĩa hoặc S3 từ xa mà không cần tải chúng vào các bảng cơ sở dữ liệu trước:
import duckdb
# Connect to in-process DuckDB instance (or persist to 'analytics.duckdb')
con = duckdb.connect()
# Enable S3 / HTTP filesystem extension
con.execute("INSTALL httpfs; LOAD httpfs;")
con.execute("""
SET s3_region='us-east-1';
SET s3_access_key_id='YOUR_KEY';
SET s3_secret_access_key='YOUR_SECRET';
""")
# Query 100GB of remote Parquet files using Vectorized SQL
query = """
SELECT
country,
event_type,
COUNT(DISTINCT user_id) AS unique_users,
ROUND(SUM(amount_cents) / 100.0, 2) AS total_revenue_usd,
ROUND(AVG(amount_cents) / 100.0, 2) AS aov_usd
FROM read_parquet('s3://analytics-bucket/events/year=2026/*/*.parquet')
WHERE event_type IN ('purchase', 'subscription')
GROUP BY country, event_type
HAVING total_revenue_usd > 10000
ORDER BY total_revenue_usd DESC
LIMIT 20;
"""
# Execute and fetch directly to Arrow, Polars, or Python dictionaries
results = con.execute(query).pl() # Returns native Polars DataFrame
print(results)
Vì cả Polars và DuckDB đều sử dụng Apache Arrow để biểu diễn bộ nhớ, bạn có thể truyền dữ liệu giữa chúng với không có chi phí tuần tự hóa hoặc sao chép bộ nhớ:
import polars as pl
import duckdb
# 1. Load and clean data with Polars
df = pl.DataFrame({
"user_id": [101, 102, 103, 104],
"scores": [88.5, 92.0, 79.5, 95.0],
"tier": ["gold", "platinum", "gold", "platinum"]
})
# 2. Run complex analytical window SQL in DuckDB directly on the Polars DataFrame
con = duckdb.connect()
# DuckDB can reference the 'df' Python variable directly in the FROM clause!
sql_result = con.execute("""
SELECT
user_id,
scores,
tier,
RANK() OVER (PARTITION BY tier ORDER BY scores DESC) as rank_in_tier,
AVG(scores) OVER (PARTITION BY tier) as tier_avg
FROM df
""").arrow() # Zero-copy Arrow Table
# 3. Convert back to Polars instantaneously
final_df = pl.from_arrow(sql_result)
print(final_df)
Tổng hợp và lọc một tập dữ liệu 10 triệu hàng trên một máy tính xách tay của nhà phát triển 8 lõi, 16GB RAM:
| Thao tác | Pandas 2.2 | Polars (Eager) | Polars (Lazy) | DuckDB (SQL) |
|---|---|---|---|---|
| Đọc Parquet + Lọc | 4.82s | 0.82s | 0.29s | 0.31s |
| Group By + 4 Aggs | 3.15s | 0.41s | 0.28s | 0.24s |
| Window Function | 2.40s | 0.35s | 0.26s | 0.21s |
| Mức sử dụng RAM cao nhất | ~4.6 GB | ~1.4 GB | ~0.7 GB | ~0.4 GB |
Dataset Scale & Use Case
│
┌─────────────────────────────────┴─────────────────────────────────┐
▼ ▼
Single Machine (< 500GB) Distributed Cluster (> 1TB)
│ │
┌────┴──────────────────────────┐ ┌─────────┴─────────┐
▼ ▼ ▼ ▼
SQL-Heavy / S3 Parquet DataFrame Transformations Batch Pipeline Real-time OLAP
▼ ▼ ▼ ▼
DuckDB Polars Apache Spark ClickHouse
(Embedded SQL) (Rust Multi-thread) / Ray / StarRocks
Một kỹ sư dữ liệu đang xử lý tập dữ liệu Parquet 50GB trên máy có 16GB RAM. Họ cần tính tổng 'sales_amount' cho từng 'product_category' và sau đó lọc các danh mục có tổng doanh số vượt quá 1.000.000 đô la. Phương pháp Polars nào phù hợp nhất để tránh `OutOfMemoryError` và đảm bảo thực thi hiệu quả?
Làm sạch log AI CLI, tạo biểu thức cron, giải mã JWT và tính quyền chmod offline.

Làm chủ SQLite trong môi trường production có lưu lượng truy cập cao. Tìm hiểu về Write-Ahead Logging (WAL), tinh chỉnh busy timeout, giới hạn đọc/ghi đồng thời, và các benchmark thực tiễn.
Đọc tiếp
Hướng dẫn toàn diện về dữ liệu cột vào năm 2026: bố cục bộ nhớ apache arrow, lưu trữ parquet & vector hóa duckdb với kiến trúc cấp độ sản xuất và các ví dụ mã.
Đọc tiếp
Cẩm nang cấp production về nhập dữ liệu serverless trên Google Cloud: BigQuery Storage Write API, chiến lược phân vùng và phân cụm, bộ nhận FastAPI async trên Cloud Run, Terraform đầy đủ, phân tích chi phí thực tế, và những chế độ lỗi gọi bạn lúc 3 giờ sáng.
Đọc tiếp