pola-rs
sử dụng kiến trúc bộ nhớ của Apche Arrow, rất khác với panda
viết bằng Python và tất nhiên là tốc độ cao hơn rất nhiều so với panda
. pola-rs
cũng có các DataFrame
là đối tượng chính mà chúng ta thường xuyên làm việc trên đó.
Các DataFrame
có cấu trúc 2D dạng bảng với hàng và cột. Bên trong, về bản chất nó là một véc-tơ các Series
, với mỗi Series
là một cột. Như vậy, dễ thấy có một ràng buộc ở đây là tất cả các Series
hay cột trong cùng một DataFrame
bắt buộc phải có độ dài giống nhau.
Các Series
trong polars
lại là một mảng 1D có tên định danh và chứa các giá trị có cùng một kiểu dữ liệu (ví dụ i32, f64, v.v.). Thực ra nó là một lớp bao trừu tượng xung quanh các giá trị có kiểu ChunkedArray
để thuận tiện hơn cho việc lập trình.
ChunkedArray<T>
là cốt lõi của Series
.
Trong các ChunkedArray
, thay vì lưu trữ tất cả dữ liệu cột trong một khối bộ nhớ lớn duy nhất, nó sẽ lưu một danh sách các phần nhỏ hơn, được xắp sếp liên tục, mỗi phần như vậy được gọi là một "chunk" và mỗi "chunk" lại thực chất là một Array
. Có thể nói ChunkedArray
là một véc-tơ của các Array
kiểu Vec<Box<dyn Array>>
.
Vậy tại sao lại tổ chức các DataFrame như vậy? Tại sao lại tổ chức thành các "chunk"?
Để có thể hiểu hơn về cách polars
tổ chức bộ nhớ cho công tác phân tích xử lý dữ liệu lớn, có lẽ sẽ tốt hơn nếu chúng ta tự mình trải nghiệm từng bước từng bước một qua các video hướng dẫn cùng các ví dụ thực tế kèm diễn giải. Các bạn hãy xem video thứ hai trong chuỗi video về polars
trên kênh Youtube RustDEV Vietnam: “#0036 - Phân tích dữ liệu với polars (Phần 02)”