Tôi muốn đưa ra một câu trả lời toàn diện hơn dựa trên hầu hết các giải pháp tiềm năng đã được cung cấp. Tôi cũng muốn chỉ ra một trợ giúp tiềm năng có thể giúp quá trình đọc.
Lựa chọn 1: bánh quy
"Dtypes" là một tham số khá mạnh mẽ mà bạn có thể sử dụng để giảm áp lực bộ nhớ của các read
phương thức. Xem điều này và câu trả lời này . Gấu trúc, theo mặc định, cố gắng suy ra các loại dữ liệu.
Đề cập đến cấu trúc dữ liệu, mọi dữ liệu được lưu trữ, phân bổ bộ nhớ đều diễn ra. Ở mức cơ bản, hãy tham khảo các giá trị bên dưới (Bảng bên dưới minh họa các giá trị cho ngôn ngữ lập trình C):
The maximum value of UNSIGNED CHAR = 255
The minimum value of SHORT INT = -32768
The maximum value of SHORT INT = 32767
The minimum value of INT = -2147483648
The maximum value of INT = 2147483647
The minimum value of CHAR = -128
The maximum value of CHAR = 127
The minimum value of LONG = -9223372036854775808
The maximum value of LONG = 9223372036854775807
Tham khảo này trang để xem sự kết hợp giữa các loại NumPy và C.
Hãy nói rằng bạn có một mảng các số nguyên của chữ số . Về mặt lý thuyết và thực tế, bạn có thể gán mảng kiểu số nguyên 16 bit, nhưng sau đó bạn sẽ phân bổ nhiều bộ nhớ hơn mức bạn thực sự cần để lưu trữ mảng đó. Để ngăn chặn điều này, bạn có thể đặt dtype
tùy chọn trên read_csv
. Bạn không muốn lưu trữ các mục mảng dưới dạng số nguyên dài trong đó thực sự bạn có thể khớp chúng với số nguyên 8 bit ( np.int8
hoặc np.uint8
).
Quan sát bản đồ dtype sau.
Nguồn: https://pbpython.com/pandas_dtypes.html
Bạn có thể truyền dtype
tham số dưới dạng tham số trên các phương thức gấu trúc dưới dạng dict trên read
như {cột: type}.
import numpy as np
import pandas as pd
df_dtype = {
"column_1": int,
"column_2": str,
"column_3": np.int16,
"column_4": np.uint8,
...
"column_n": np.float32
}
df = pd.read_csv('path/to/file', dtype=df_dtype)
Cách 2: Đọc bởi Chunks
Đọc dữ liệu theo từng khối cho phép bạn truy cập một phần dữ liệu trong bộ nhớ và bạn có thể áp dụng tiền xử lý trên dữ liệu của mình và bảo toàn dữ liệu đã xử lý thay vì dữ liệu thô. Sẽ tốt hơn nhiều nếu bạn kết hợp tùy chọn này với cái đầu tiên, dtypes .
Tôi muốn chỉ ra các phần sách dạy nấu ăn của gấu trúc cho quá trình đó, nơi bạn có thể tìm thấy nó ở đây . Lưu ý hai phần đó;
Tùy chọn 3: Dask
Dask là một khung được định nghĩa trong trang web của Dask là:
Dask cung cấp tính song song nâng cao cho các phân tích, cho phép hiệu suất ở quy mô cho các công cụ bạn yêu thích
Nó được sinh ra để bao gồm những phần cần thiết nơi gấu trúc không thể với tới. Dask là một khung công tác mạnh mẽ cho phép bạn truy cập dữ liệu nhiều hơn bằng cách xử lý nó theo cách phân tán.
Bạn có thể sử dụng dask để xử lý toàn bộ dữ liệu của mình, Dask sẽ chăm sóc phần chunk, vì vậy không giống như gấu trúc, bạn chỉ có thể xác định các bước xử lý của mình và để Dask thực hiện công việc. Dask không áp dụng các tính toán trước khi nó được đẩy mạnh compute
và / hoặc persist
(xem câu trả lời ở đây để biết sự khác biệt).
Các phương tiện khác (Ý tưởng)
- Lưu lượng ETL được thiết kế cho dữ liệu. Chỉ giữ lại những gì cần thiết từ dữ liệu thô.
- Đầu tiên, áp dụng ETL cho toàn bộ dữ liệu với các khung như Dask hoặc PySpark và xuất dữ liệu đã xử lý.
- Sau đó xem liệu dữ liệu được xử lý có thể phù hợp với toàn bộ bộ nhớ không.
- Xem xét tăng RAM của bạn.
- Xem xét làm việc với dữ liệu đó trên nền tảng đám mây.