pickle序列化python類實例,redis持久化python類實例

當我們想要持久化Python實例的時候,可以使用兩種方式進行:

1、可以先將對象轉成字符串格式再進行保存:

使用pickle的dumps,loads,這裏需要使用帶s的函數,表示中間層是以字符串作爲中介的。

例如:先創建一個測試類

class SomeCustomObject:
    def __init__(self):
        pass

    def func(self):
        print("test code")

將類實例持久化到本地:

import pickle

sco = SomeCustomObject()
model_pkl = open("model_instance.pkl", "wb")
sco_instance_pkl = pickle.dumps(sco)
model_pkl.write(sco_instance_pkl)
model_pkl.close()

從本地加載:

with open("model_instance.pkl", "rb") as f:
    sco_instance = pickle.loads(f.read())

sco_instance.func()

將會輸出一下內容(說明已經成功):

"test code"

2、也可以使用redis將實例持久化

import redis

# 將實例存入redis
rs = redis.Redis()
rs.set("test_model", pickle.dumps(sco))

# 從redis重新加載實例
sco_rs = pickle.loads(rs.get("test_model"))
sco_rs.func()

將得到和1一樣的效果。

注意:

有一些對象使用dumps就會直接報錯。

處理方法:

1.參數哪一些值是不可以被dumps的,遍歷一下其屬性

2.在自定義的類中添加__getstate__ 與 __setstate__方法:

__getstate__:
    return 需要保存的信息

__setstate__(state):
    state的信息就是上面__getstate__返回的信息,這裏進行還原

3.確有一些實在是保存不了的,那就保存其初始化需要的參數。

建議較小的實例使用redis持久化,而較大的實例(如深度模型實例)存儲在本地較快。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章