Last Updated on March 11, 2023 by
Dalam konteks penyimpanan data, Serialization adalah proses menerjemahkan struktur data atau status objek ke dalam format yang dapat disimpan (misalnya, dalam file atau buffer memori) atau dikirim dan direkonstruksi nanti.
Pembahasan belajar Python kali ini kita akan mempelajari Serialization dan bagaimana mengoperasikannya sehingga dapat membantu kita dalam penyimpanan data. Anda akan menemukan cara menggunakan dua pustaka Serialization umum di Python untuk membuat serial objek data (yaitu pickle dan HDF5) seperti kamus dan model Tensorflow di Python untuk penyimpanan dan transmisi.
Table of Contents
Serialization Adalah Cara Termudah Menyimpan Objek Python
Pikirkan tentang menyimpan bilangan bulat; bagaimana Anda menyimpannya dalam file atau mengirimkannya? Itu mudah! Kami cukup menulis bilangan bulat ke file dan menyimpan atau mengirimkan file itu.
Tapi sekarang, bagaimana jika kita berpikir tentang menyimpan objek Python (misalnya kamus Python atau Pandas DataFrame), yang memiliki struktur kompleks dan banyak atribut (misalnya kolom dan indeks DataFrame, dan tipe data dari setiap kolom )? Bagaimana Anda menyimpannya sebagai file atau mengirimkannya ke komputer lain?
Di sinilah Serialization diperlukan!
Serialization adalah proses mengubah objek menjadi format yang dapat disimpan atau ditransmisikan. Setelah mentransmisikan atau menyimpan data serial, kami dapat merekonstruksi objek nanti dan mendapatkan struktur/objek yang sama persis, yang membuatnya sangat nyaman bagi kami untuk terus menggunakan objek yang disimpan nanti daripada merekonstruksi objek dari awal.
Di Python, ada banyak format berbeda untuk Serialization yang tersedia. Salah satu contoh umum adalah peta hash (kamus Python) yang berfungsi di banyak bahasa adalah format file JSON yang dapat dibaca manusia dan memungkinkan kita untuk menyimpan kamus dan membuatnya kembali dengan struktur yang sama.
Tetapi JSON hanya dapat menyimpan struktur dasar seperti daftar dan kamus, dan hanya dapat menyimpan string dan angka. Kami tidak dapat meminta JSON untuk mengingat tipe data (misalnya, numpy float32 vs. float64). Itu juga tidak dapat membedakan antara tupel dan daftar Python.
Ada format Serialization yang lebih kuat. Berikut ini, kita akan menjelajahi dua pustaka Serialization umum di Python, yaitu pickle dan h5py.
Pustaka Umum Serialization Adalah Pickle
Pickle adalah proses dimana hierarki objek Python diubah menjadi aliran byte (biasanya tidak dapat dibaca manusia) untuk ditulis ke file, ini juga dikenal sebagai Serialisasi. Unpickling adalah proses kebalikannya, di mana aliran byte diubah kembali menjadi hierarki objek Python yang berfungsi.
Pickle secara operasional adalah cara paling sederhana untuk menyimpan objek. Modul Python Pickle Serialization adalah cara berorientasi objek untuk menyimpan objek secara langsung dalam format penyimpanan khusus.
Yang Dapat Dilakukan Pickle Serialization Adalah
- Pickle dapat menyimpan dan memproduksikembali kamus dan daftar dengan mudah.
- Menyimpan atribut objek dan mengembalikannya kembali ke keadaan yang sama.
Apa yang tidak bisa dilakukan pickle?
- Ia tidak menyimpan kode objek. Hanya itu nilai atribut.
- Pickle tidak dapat menyimpan pegangan file atau soket koneksi.
Singkatnya bisa kita katakan, pickle adalah cara untuk menyimpan dan mengambil variabel data masuk dan keluar dari file di mana variabel dapat berupa daftar, kelas, dll.
Metode Pickle
Menggunakan Pustaka Pickle Python
Modul ini pickle adalah bagian dari pustaka standar Python dan mengimplementasikan metode untuk membuat serial (pengawetan) dan deserialisasi (pembongkaran) objek Python.
- Untuk memulai pickle, impor dengan Python:
- Setelah itu, untuk membuat serial objek Python seperti kamus dan menyimpan aliran byte sebagai file, kita dapat menggunakan dump()metode pickle.
test_dict = {"Codekey": "Python!"} with open("test.pickle", "wb") as outfile: # "wb" argument membuka file dalam mode biner pickle.dump(test_dict, outfile)
- Aliran byte yang mewakili test_dict sekarang disimpan dalam file “ test.pickle”!
- Untuk memulihkan objek asli, kami membaca aliran byte serial dari file menggunakan load()metode pickle.
with open("test.pickle", "rb") as infile: test_dict_reconstructed = pickle.load(infile)
Menyatukannya, kode berikut membantu Anda memverifikasi bahwa pickle dapat memulihkan objek yang sama :
import pickle # Objek tes test_dict = {"Codekey": "Python!"} # Serialization with open("test.pickle", "wb") as outfile: pickle.dump(test_dict, outfile) print("Written object", test_dict) # Deserialization with open("test.pickle", "rb") as infile: test_dict_reconstructed = pickle.load(infile) print("Reconstructed object", test_dict_reconstructed) if test_dict == test_dict_reconstructed: print("Rekonstruksi sukses")
- Selain menulis objek berseri ke dalam file pickle, kita juga bisa mendapatkan objek berseri sebagai tipe byte-array di Python menggunakan fungsi pickle dumps():
test_dict_ba = pickle.dumps(test_dict) # b'\x80\x04\x95\x15…
- Demikian pula, kita dapat menggunakan metode pickle load untuk mengonversi dari tipe byte-array kembali ke objek aslinya :
test_dict_reconstructed_ba = pickle.loads(test_dict_ba)
Satu hal yang berguna tentang Pickle Serialization adalah ia dapat membuat cerita bersambung hampir disemua objek Python, termasuk yang ditentukan pengguna, seperti berikut ini:
import pickle class NewClass: def __init__(self, data): print(data) self.data = data # Buat objek NewClass new_class = NewClass(1) # Serialize and deserialize pickled_data = pickle.dumps(new_class) reconstructed = pickle.loads(pickled_data) # Verify print("Data from reconstructed object:", reconstructed.data)
Perhatikan bahwa pernyataan print dalam konstruktor kelas tidak dijalankan pada saat pickle.loads() dipanggil. Ini karena ia merekonstruksi objek, bukan membuatnya kembali.
- Pickle bahkan dapat membuat serialisasi fungsi Python karena fungsi adalah objek kelas satu di Python :
import pickle def test(): return "Hello world!" # Serialize and deserialize pickled_function = pickle.dumps(test) reconstructed_function = pickle.loads(pickled_function) # Verify print (reconstructed_function()) #prints “Hello, world!”
Oleh karena itu, kita dapat memanfaatkan pickle untuk menghemat pekerjaan kita. Misalnya, model yang dilatih dari Keras atau scikit-learn dapat diserialkan dengan pickle dan dimuat nanti alih-alih melatih ulang model setiap kali kita menggunakannya.
Berikut ini menunjukkan kepada Anda bagaimana kami dapat membangun model LeNet5 untuk mengenali digit tulisan tangan MNIST menggunakan Keras, kemudian membuat serial model yang dilatih menggunakan pickle. Setelah itu, kita dapat merekonstruksi model tanpa melatihnya kembali, dan seharusnya menghasilkan hasil yang persis sama dengan model aslinya:
import pickle import numpy as np import tensorflow as tf from tensorflow.keras.datasets import mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, Dense, AveragePooling2D, Dropout, Flatten from tensorflow.keras.utils import to_categorical from tensorflow.keras.callbacks import EarlyStopping # Load digit MNIST (X_train, y_train), (X_test, y_test) = mnist.load_data() # Bentuk ulang data menjadi (n_samples, height, wiedth, n_channel) X_train = np.expand_dims(X_train, axis=3).astype("float32") X_test = np.expand_dims(X_test, axis=3).astype("float32") # Enkode output y_train = to_categorical(y_train) y_test = to_categorical(y_test) # LeNet5 model model = Sequential([ Conv2D(6, (5,5), input_shape=(28,28,1), padding="same", activation="tanh"), AveragePooling2D((2,2), strides=2), Conv2D(16, (5,5), activation="tanh"), AveragePooling2D((2,2), strides=2), Conv2D(120, (5,5), activation="tanh"), Flatten(), Dense(84, activation="tanh"), Dense(10, activation="softmax") ]) # Melatih model model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) earlystopping = EarlyStopping(monitor="val_loss", patience=4, restore_best_weights=True) model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=100, batch_size=32, callbacks=[earlystopping]) # Evaluasi model print(model.evaluate(X_test, y_test, verbose=0)) # Serialize and deserialize untuk pickel pickled_model = pickle.dumps(model) reconstructed = pickle.loads(pickled_model) # Evaluasi kembali print(reconstructed.evaluate(X_test, y_test, verbose=0))
Meskipun pickle Serialization adalah perpustakaan yang kuat, pickle masih memiliki batasannya sendiri untuk pickle. Misalnya, koneksi langsung seperti koneksi database dan pegangan file yang dibuka tidak dapat diacak.
Masalah ini muncul karena merekonstruksi objek-objek ini memerlukan pickle untuk membangun kembali koneksi dengan database/file, yang merupakan sesuatu yang tidak dapat dilakukan oleh pickle untuk Anda (karena memerlukan kredensial yang sesuai dan berada di luar cakupan yang dimaksudkan untuk pickle).
Bantuan Termudah Serialization Adalah HDF5
Hierarchical Data Format 5 (HDF5) adalah format data biner. Paket tersebut h5py adalah pustaka Python yang menyediakan antarmuka ke format HDF5. Dari h5py dokumen, HDF5 “memungkinkan Anda menyimpan data numerik dalam jumlah besar, dan dengan mudah memanipulasi data tersebut dari Numpy”.
Apa yang dapat dilakukan HDF5 lebih baik daripada format lain serialization adalah menyimpan data dalam hierarki seperti sistem file. Anda dapat menyimpan banyak objek atau kumpulan data di HDF5, seperti menyimpan banyak file di sistem file. Anda juga dapat membaca kumpulan data tertentu dari HDF5, seperti membaca satu file dari sistem file tanpa mempedulikan yang lain. Jika Anda menggunakan pickle untuk ini, Anda harus membaca dan menulis semuanya setiap kali Anda memuat atau membuat file pickle. Karenanya HDF5 menguntungkan untuk sejumlah besar data yang tidak dapat masuk sepenuhnya ke dalam memori.
- Untuk memulai h5py, pertama-tama Anda harus menginstal h5pypustaka, yang dapat Anda lakukan dengan menggunakan PIP Instal
- Atau, Anda dapat menggunakan conda jika memulai dengan lingkungan conda:
- Kita kemudian dapat memulai dengan membuat kumpulan data pertama kita!
import h5py with h5py.File("test.hdf5", "w") as file: dataset = file.create_dataset("test_dataset", (100,), type="i4")
sintaks di atas membuat dataset baru dalam file test.hdf5 bernama “ test_dataset,” dengan bentuk (100, ) dan tipe int32. h5py kumpulan data mengikuti sintaks Numpy sehingga Anda dapat melakukan pemotongan, pengambilan, mendapatkan bentuk, dll., mirip dengan array Numpy.
- Untuk mengambil indeks tertentu:
dataset[0] # Mengambil elemen pada indeks 0 dari dataset
- Untuk membaca dari file HDF5 yang dibuat sebelumnya, Anda dapat membuka file di ” r” untuk mode baca atau ” r+” untuk mode baca/tulis :
with h5py.File("test.hdf5", "r") as file: print (file.keys()) # Mendapat nama kumpulan data yang ada di file dataset = file["test_dataset"]
- Untuk mengatur file HDF5 Anda, Anda dapat menggunakan grup:
with h5py.File("test.hdf5", "w") as file: # Membuat group_1 baru dalam file file.create_group("group_1") group1 = file["group_1"] # Membuat dataset di dalam grup1 group1.create_dataset("dataset1", shape=(10,)) # Akses dataset dataset = file["group_1"]["dataset1"]
Cara lain untuk membuat grup dan file adalah dengan menentukan jalur ke kumpulan data yang ingin Anda buat, dan h5py akan membuat grup di jalur tersebut juga (jika tidak ada):
with h5py.File("test.hdf5", "w") as file: # Membuat dataset dalam group1 file.create_dataset("group1/dataset1", shape=(10,))
Format JSON
Ada dua format dasar untuk data JSON. Baik dalam string atau struktur data objek. Struktur data objek, dengan Python, terdiri dari daftar dan kamus yang bersarang di dalam satu sama lain. Struktur data objek memungkinkan seseorang untuk menggunakan metode python (untuk daftar dan kamus) untuk menambah, mendaftar, mencari, dan menghapus elemen dari struktur data. Format String terutama digunakan untuk meneruskan data ke program lain atau memuat ke dalam struktur data.
- Untuk memuat kembali JSON ke struktur data, gunakan metode “Loads”. Metode ini mengambil string dan mengubahnya kembali menjadi struktur data objek json :
import json print(json.loads(json_string))
- Untuk membuat kode struktur data ke JSON, gunakan metode “dumps”. Metode ini mengambil objek dan mengembalikan sebuah String:
import json json_string = json.dumps([1, 2, 3, "a", "b", "c"]) print(json_string)
- Tujuan dari latihan ini adalah untuk mencetak string JSON dengan key-value pair “Me” : 800 ditambahkan ke dalamnya.
import json # perbaiki fungsi ini, sehingga menambahkan nama yang diberikan # dan pasangan gaji ke salaries_json, dan mengembalikannya def add_employee(salaries_json, name, salary): # Tambahkan code anda disini return salaries_json # tes code salaries = '{"Joe" : 300, "Danil" : 400 }' new_salaries = add_employee(salaries, "Me", 800) decoded_salaries = json.loads(new_salaries) print(decoded_salaries["Alfred"]) print(decoded_salaries["Jane"]) print(decoded_salaries["Me"])
Membandingkan Antara Berbagai Metode Serialisasi
Di atas, kita melihat bagaimana pickle Hdf5 dapat membantu membuat serialisasi data Python kita.
Kita dapat menggunakan pickle untuk membuat cerita bersambung hampir semua objek Python, termasuk objek dan fungsi yang ditentukan pengguna. Tapi pickle bukanlah agnostik bahasa. Anda tidak dapat melepaskannya di luar Python. Bahkan ada 6 versi pickle yang dikembangkan sejauh ini, dan Python yang lebih lama mungkin tidak dapat menggunakan data pickle versi yang lebih baru.
Sebaliknya, HDF5 Serialization adalah lintas platform dan bekerja dengan baik dengan bahasa lain seperti Java dan C++. Di Python, h5py perpustakaan mengimplementasikan antarmuka Numpy untuk mempermudah manipulasi data. Data dapat diakses dalam bahasa yang berbeda karena format HDF5 hanya mendukung tipe data Numpy seperti float dan string. Kami tidak dapat menyimpan objek arbitrer seperti fungsi Python ke dalam HDF5.
JSON (JavaScript Objek Notation) telah menjadi bagian dari pustaka standar Python adalah format pertukaran data yang ringan. Sangat mudah bagi orang untuk membaca dan menulis. Sangat mudah untuk mengurai dan menghasilkan.
Temukan lebih banyak artikel seri belajar Python maupun bahasa pemrograman lainnya hanya di CODEKEY. Klik https://codekey.id/ sekarang juga untuk langsung belajar gratis. Sampai bertemu lagi!
Jasa Pembuatan Aplikasi, Website dan Internet Marketing | PT APPKEY
PT APPKEY adalah perusahaan IT yang khusus membuat aplikasi Android, iOS dan mengembangkan sistem website. Kami juga memiliki pengetahuan dan wawasan dalam menjalankan pemasaran online sehingga diharapkan dapat membantu menyelesaikan permasalahan Anda.