Hướng dẫn python pickle compression - nén dưa muối trăn

Pickle là một thư viện tuần tự hóa mạnh mẽ trong Python, có khả năng tuần tự hóa các đối tượng (pickling) cho các tệp để sử dụng sau. Thông thường khi làm việc với các bộ dữ liệu lớn, kích thước của các tệp này có thể khá lớn. Điều này cũng làm chậm việc tải và đổ dữ liệu, khiến bạn phải chờ đợi lâu hơn. Để giải quyết vấn đề này, chúng tôi nén các kết xuất tệp Pickle của chúng tôi, giúp giảm đáng kể kích thước.

Trong hướng dẫn này, chúng tôi sẽ sử dụng thư viện nén BZ2. Ngoài ra còn có thư viện GZIP nhanh hơn một chút, nhưng không tốt khi giảm kích thước tệp.


Nén dữ liệu

Trước tiên, hãy để một cái nhìn vào dữ liệu mà chúng ta sẽ bỏ vào một tệp.

Chúng tôi đã đưa ra một đoạn mã tốt tạo ra 1000 đối tượng từ lớp tùy chỉnh của chúng tôi. Để đưa một số chủ nghĩa hiện thực vào mã của chúng tôi, tôi cũng đã sử dụng thư viện ngẫu nhiên để thêm một số loại vào dữ liệu của các đối tượng sinh viên bằng cách chọn một kết hợp ngẫu nhiên giữa tên và giới tính.

# Data to be Compresssed
import pickle
import bz2
import random
import os

class Student:
    def __init__(self, ID, Name, Gender):
        self.ID = ID
        self.Name = Name
        self.Gender = Gender

    def display(self):
        print("Name:", self.Name,
              "ID:", self.ID,
              "Gender:", self.Gender)

data = []
names = ["Bob", "Rob", "Sam", "Jane", "Sally", "John", "Emilia"]
genders = ["M", "F", "O"]

for x in range(1000):
    data.append(Student(x, random.choice(names), random.choice(genders)))

Bây giờ chúng tôi có danh sách của chúng tôi có tên là Dữ liệu, có 1000 đối tượng sinh viên. Hãy cùng thử bỏ việc đổ nó vào một tập tin và xem điều gì sẽ xảy ra.

# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size

Mã trên trả về đầu ra sau:

30155

Nén dữ liệu tệp pickle

Bây giờ, hãy để chúng tôi thấy chúng tôi có thể nén tệp đó bằng cách sử dụng

# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
9 bao nhiêu. Chúng tôi sẽ thực hiện một quy trình tương tự một lần nữa, nhưng lần này thông qua các chức năng của ____99S.

Về cơ bản, tất cả những gì chúng ta phải làm, là sử dụng lớp

# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
0, thay vì hàm
# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
1 tiêu chuẩn được thấy trong xử lý tệp thông thường. Tương tự như vậy, bạn cũng có thể sử dụng hàm
# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
2, sẽ cung cấp hiệu ứng nén tương tự.

Đối với phần mềm, tham số đầu tiên là FilePath hoặc FileName, và thứ hai là chế độ mà nó đã mở. Vì chúng tôi đang xử lý dữ liệu nhị phân, chúng tôi cần sử dụng WB WB.

# Compressing Data

ofile = bz2.BZ2File("BinaryData",'wb')
pickle.dump(data,ofile)
ofile.close()

print(os.path.getsize("BinaryData"))

Ở đây, kích thước tệp mới, mà chúng tôi thu được bằng cách sử dụng hàm

# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
3 từ thư viện HĐH.
5653

Nói chung, chúng tôi đã quan sát thấy một cải tiến 5X đẹp so với kích thước tệp Pickle ban đầu. Và tất cả chỉ cần thêm vào một vài dòng mã. Trong phần tiếp theo, chúng tôi sẽ khám phá cách đọc nội dung này trở lại Python để chúng tôi có thể sử dụng nó.

Kiểm tra hướng dẫn BZ2 để biết các cách nén dữ liệu thay thế hoặc hướng dẫn GZIP để nén nhanh hơn!


Giải nén dữ liệu dưa chua trong python

Giải nén dữ liệu tệp Pickle Python khá dễ dàng và có thể được thực hiện theo hai cách. Phương thức đầu tiên được hiển thị bên dưới, trong đó chúng tôi sử dụng phương thức

# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
4 để trả về một đối tượng luồng tệp.

Giống như trước đây, cú pháp là như nhau, trong đó tham số đầu tiên là tên tệp (sử dụng filepath nếu trong một thư mục khác) và tham số thứ hai là RB RB để đọc các tệp nhị phân.

Khi chúng tôi đã sẵn sàng đối tượng BZ2File của mình, chúng tôi chỉ cần chuyển nó vào

# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
5, lấy một đối tượng luồng tệp làm tham số.
# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
5 sẽ trả lại dữ liệu ngâm trong cùng một hình thức mà nó đã được đổ.
# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
2

Dưới đây là 6 kết quả đầu tiên từ đầu ra của mã trên.

# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
3

Phương pháp luân phiên

Đây là một phương pháp đọc dữ liệu thay thế.

Thay vì chuyển một đối tượng luồng tệp cho

# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
5, chúng ta có thể chọn chuyển dữ liệu ngâm dưới dạng chuỗi thành
# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
8. Tất nhiên, chúng tôi sẽ phải giải nén nó trước (hoặc pickle won nhận ra nó) bằng cách sử dụng hàm
# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
9, lấy dữ liệu chuỗi. Và chúng tôi sẽ phải sử dụng chức năng
30155
0 trên đối tượng luồng tệp.

Nhìn chung, nó rất nhiều phương pháp được sử dụng, nhưng nó chỉ là một chương trình giới thiệu thú vị và một cách xử lý mọi thứ thay thế.

# Writing data normally to a file (pickle)

ofile = open("BinaryData",'wb')
pickle.dump(data, ofile)
ofile.close()

print(os.path.getsize("BinaryData"))  # Return file size
8

Và tất nhiên, đầu ra của mã trên sẽ giống như mã trước.


Điều này đánh dấu sự kết thúc của Hướng dẫn nén tệp Python Pickle. Bất kỳ đề xuất hoặc đóng góp cho Coderslegacy đều được chào đón nhiều hơn. Các câu hỏi liên quan đến nội dung hướng dẫn có thể được hỏi trong phần bình luận bên dưới.