當我們想要持久化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持久化,而較大的實例(如深度模型實例)存儲在本地較快。