INNOVATION

Tối Ưu Hóa Pipeline Phân Tích Dữ Liệu Lớn Với Pandas

Bùi Đăng MinhThứ sáu, 12/6/20267 min read
Tối Ưu Hóa Pipeline Phân Tích Dữ Liệu Lớn Với Pandas

Pandas là thư viện phân tích dữ liệu phổ biến nhất trong Python. Tuy nhiên, khi kích thước dữ liệu vượt quá vài GB, các thao tác mặc định của Pandas có thể tiêu tốn rất nhiều RAM và làm chậm hệ thống đáng kể.

1. Ép kiểu dữ liệu (Downcasting Types)

Mặc định, Pandas thường tự gán kiểu dữ liệu số nguyên là int64 và số thực là float64. Việc ép về int8, int16 hoặc float32 giúp tiết kiệm đến 75% dung lượng bộ nhớ.

import pandas as pd
import numpy as np

# Đọc dữ liệu mẫu
df = pd.read_csv('huge_dataset.csv')

# Tối ưu hóa kiểu số
for col in df.select_dtypes(include=[np.number]).columns:
    df[col] = pd.to_numeric(df[col], downcast='integer')
    df[col] = pd.to_numeric(df[col], downcast='float')

2. Sử dụng kiểu dữ liệu Category

Đối với các cột chứa văn bản lặp lại nhiều lần (như giới tính, quốc gia, trạng thái đơn hàng), hãy chuyển chúng sang kiểu 'category' để tối ưu tốc độ tìm kiếm và sắp xếp.

# Chuyển đổi cột kiểu object sang category
df['gender'] = df['gender'].astype('category')
df['status'] = df['status'].astype('category')

# Kiểm tra mức độ giảm dung lượng bộ nhớ
print(df.info(memory_usage='deep'))

3. Sử dụng Vectorization thay vì lặp (Loops)

Sử dụng vòng lặp `for` hoặc `.iterrows()` để duyệt qua DataFrame cực kỳ chậm vì Pandas phải xử lý từng hàng một cách tuần tự. Thay vào đó, hãy sử dụng các phép toán vectorized để xử lý toàn bộ mảng dữ liệu song song trên nền tảng C/C++.

# TỆ - Sử dụng vòng lặp duyệt từng hàng
for idx, row in df.iterrows():
    df.at[idx, 'new_col'] = row['val'] * 2

# TỐT - Sử dụng vectorization của Pandas/Numpy
df['new_col'] = df['val'] * 2

Kết luận

Chỉ với việc ép kiểu dữ liệu phù hợp, tận dụng kiểu category và triệt để áp dụng vectorization, pipeline xử lý dữ liệu của bạn có thể chạy nhanh hơn tới 10 lần và tiết kiệm hàng gigabyte bộ nhớ RAM khi làm việc với Big Data.