Lưu trữ dữ liệu trên đám mây có thể tiêu tốn của bạn một khoản tiền khá lớn. Đương nhiên, bạn sẽ muốn tránh xa định dạng lưu trữ dữ liệu được biết đến rộng rãi nhất - CSV - và chọn thứ gì đó nhẹ hơn một chút. Đó là, nếu bạn không quan tâm đến việc xem và chỉnh sửa các tệp dữ liệu một cách nhanh chóng
Hôm nay bạn sẽ tìm hiểu về một trong những cách đơn giản nhất để lưu trữ hầu hết mọi thứ trong Python — Pickle. Pickling không chỉ giới hạn ở các bộ dữ liệu, như bạn sẽ thấy ngay sau đây, nhưng mọi ví dụ trong bài viết đều dựa trên các bộ dữ liệu
Pickle chính xác là gì?
Trong Python, bạn có thể sử dụng mô-đun pickle
để tuần tự hóa các đối tượng và lưu chúng vào một tệp. Sau đó, bạn có thể giải tuần tự hóa tệp được tuần tự hóa để tải lại chúng khi cần
Pickle có một lợi thế lớn so với các định dạng khác — bạn có thể sử dụng nó để lưu trữ bất kỳ đối tượng Python nào. Đúng vậy, bạn không bị giới hạn dữ liệu. Một trong những chức năng được sử dụng rộng rãi nhất là lưu các mô hình máy học sau khi đào tạo xong. Bằng cách đó, bạn không phải đào tạo lại mô hình mỗi khi chạy tập lệnh
Tôi cũng đã sử dụng Pickle nhiều lần để lưu trữ mảng Numpy. Đó là một giải pháp đơn giản để thiết lập một số loại điểm kiểm tra trong mã của bạn
Âm thanh như một định dạng lưu trữ hoàn hảo? . Pickle có một vài thiếu sót bạn nên biết
- Hỗ trợ đa ngôn ngữ không được đảm bảo — Pickle dành riêng cho Python, vì vậy không ai có thể đảm bảo bạn sẽ có thể đọc các tệp được chọn bằng ngôn ngữ lập trình khác
- Các tệp được chọn dành riêng cho phiên bản Python — Bạn có thể gặp sự cố khi lưu tệp trong một phiên bản Python và đọc chúng trong phiên bản khác. Cố gắng làm việc trong các phiên bản Python giống hệt nhau, nếu có thể
- Pickling không nén dữ liệu — Pickling một đối tượng sẽ không nén nó. Chắc chắn, tệp sẽ nhỏ hơn khi so sánh với CSV, nhưng bạn có thể nén dữ liệu theo cách thủ công để đạt hiệu quả tối đa
Bạn sẽ sớm thấy cách khắc phục để nén dữ liệu. Tiếp theo hãy xem cách làm việc với Pickle trong Python
Làm cách nào để làm việc với Pickle trong Python?
Hãy bắt đầu bằng cách nhập các thư viện cần thiết và tạo một tập dữ liệu tương đối lớn. Bạn sẽ cần Numpy, Pandas, Pickle và BZ2. Bạn sẽ sử dụng cái cuối cùng để nén dữ liệu
import numpy as np
import pandas as pd
import pickle
import bz2
np.random.seed = 42
df_size = 10_000_000
df = pd.DataFrame[{
'a': np.random.rand[df_size],
'b': np.random.rand[df_size],
'c': np.random.rand[df_size],
'd': np.random.rand[df_size],
'e': np.random.rand[df_size]
}]
df.head[]
Đây là cách tập dữ liệu trông như thế nào
Hình ảnh 1 - Bộ dữ liệu giả ngẫu nhiên [hình ảnh của tác giả]
Hãy lưu nó cục bộ tiếp theo. Bạn có thể sử dụng lệnh sau để chọn DataFrame
with open['10M.pkl', 'wb'] as f:
pickle.dump[df, f]
Tệp được lưu cục bộ ngay bây giờ. Bạn có thể đọc nó theo cách tương tự — chỉ cần thay đổi chế độ từ wb
sang rb
with open['10M.pkl', 'rb'] as f:
df = pickle.load[f]
Thật tuyệt vời. Như đã đề cập trước đó, Pickle sẽ không thực hiện bất kỳ thao tác nén nào theo mặc định. Bạn sẽ phải chăm sóc nó theo cách thủ công. Python làm cho nó trở nên dễ dàng một cách ngu ngốc với mô-đun bz2
with open['10M_compressed.pkl', 'wb'] as f:
compressed_file = bz2.BZ2File[f, 'w']
pickle.dump[df, compressed_file]
Nó chỉ là một dòng mã bổ sung, nhưng nó có thể giúp bạn tiết kiệm thời gian sử dụng đĩa. Quá trình tiết kiệm sẽ lâu hơn đáng kể, nhưng đó là sự đánh đổi mà bạn sẽ phải chấp nhận
Đọc một tệp nén yêu cầu một dòng mã bổ sung
with open['10M_compressed.pkl', 'rb'] as f:
compressed_file = bz2.BZ2File[f, 'r']
df = pickle.load[compressed_file]
Chỉ cần đảm bảo không làm rối các chế độ tệp, vì cung cấp wb
khi đọc tệp sẽ xóa tất cả nội dung của tệp. Tốt nhất là viết các hàm trợ giúp cho các thao tác đọc và ghi, để bạn không bao giờ làm chúng rối tung lên
Phần sau đây bao gồm so sánh với định dạng tệp CSV — về kích thước tệp, thời gian đọc và ghi
CSV so với. Dưa chua - Bạn nên sử dụng loại nào?
Trả lời câu hỏi này không phải là dễ dàng như nó có vẻ. Chắc chắn rồi, CSV cung cấp đặc quyền xem và chỉnh sửa vì bất kỳ ai cũng có thể mở chúng. Đó cũng có thể được coi là một nhược điểm, vì những lý do rõ ràng. Ngoài ra, bạn không thể lưu các mô hình máy học vào tệp CSV
Tuy nhiên, hãy so sánh cả hai về kích thước tệp, thời gian đọc và ghi
Biểu đồ sau đây cho thấy thời gian cần thiết để lưu DataFrame từ phần cuối cục bộ
Hình ảnh 2 — CSV so với. Pickle tiết kiệm thời gian cục bộ tính bằng giây [CSV. 34. 9; . 32. 7; . 0. 44] [ảnh của tác giả]
Đó là tốc độ tăng khoảng 80 lần, nếu bạn không quan tâm đến việc nén
Tiếp theo, hãy so sánh thời gian đọc — mất bao lâu để đọc các bộ dữ liệu giống hệt nhau ở các định dạng khác nhau
Hình ảnh 3 — CSV so với. Thời gian đọc dưa chua tính bằng giây [CSV. 3. 71; . 15. 3; . 0. 339] [ảnh của tác giả]
Pickle lần này nhanh hơn khoảng 11 lần, khi không nén. Quá trình nén là một vấn đề lớn khi đọc và lưu tệp. Nhưng, hãy xem nó tiết kiệm được bao nhiêu dung lượng ổ đĩa
Đó là những câu trả lời trực quan hóa sau đây
Hình ảnh 4 — CSV so với. Kích thước tệp dưa chua tính bằng MB [CSV. 963. 5; . 381. số 8; . 400] [ảnh của tác giả]
Kích thước tệp giảm khi so sánh với CSV là đáng kể, nhưng quá trình nén không tiết kiệm được nhiều dung lượng ổ đĩa trong trường hợp này
Tóm lại, chuyển từ CSV sang Pickle mang lại những lợi thế rõ ràng. Điều không rõ ràng 100% là Pickle cho phép bạn lưu trữ các đối tượng khác — bất kỳ thứ gì được tích hợp trong Python, mảng Numpy và thậm chí cả các mô hình máy học. CSV và các định dạng chỉ chứa dữ liệu khác không có khả năng đó
Suy nghĩ và trải nghiệm của bạn với Pickle là gì?
Thích bài viết? . Tôi sẽ nhận được một phần phí thành viên của bạn nếu bạn sử dụng liên kết sau mà không phải trả thêm phí