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持久化,而较大的实例(如深度模型实例)存储在本地较快。

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