当我们想要持久化Python实例的时候,可以使用两种方式进行:
使用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"
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持久化,而较大的实例(如深度模型实例)存储在本地较快。