RS(纠删码)技术浅析及Python实现

枫铃3年前 (2021-07-10)Python221

前言
在Ceph和RAID存储领域,RS纠删码扮演着重要的角色,纠删码是经典的时间换空间的案例,通过更多的CPU计算,降低低频存储数据的存储空间占用。

纠删码原理
纠删码基于范德蒙德矩阵实现,核心公式如下所示(AD=E)
在这里插入图片描述
假设某些数据丢失,右式部分行丢失,变成E’,则左式也相应去掉对应行,变成A’。
在这里插入图片描述
函数Inverse[A′]Inverse[A′]代表A’的逆矩阵,I代表单位矩阵
在这里插入图片描述
Python实现

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
import numpy as np

# 备份数量
backup_up = 2
# 原始数据
data = np.array([1, 0, 0, 8, 6])
# 根据纠删码原理生成的数据
vander_data = np.concatenate((np.identity(len(data)), np.vander(data, 3).transpose()[::-1]), axis=0)
storage_data = vander_data.dot(data)
print('生成数据',storage_data)
# 模拟数据丢失
loss_data = np.concatenate((storage_data[0:3], storage_data[5:7]), axis=0)
print('丢失后数据', loss_data)
# 恢复数据
recover_data = np.linalg.inv(np.concatenate((vander_data[0:3], vander_data[5:7]), axis=0)).dot(loss_data)
print('恢复数据',recover_data)

基于Python的Numpy库可以很容易地模拟纠删码数据恢复的流程。效果如下所示
在这里插入图片描述

伽罗华域优化

实际上,上述的Python代码只是纠删码的最基础版本,可以发现校验数据大于原始数据,这样就导致校验数据需要更多的存储位,并没有很好的优化存储空间。

在现实场景中,纠删码一般通过自定义的伽罗华域进行运算,保证位数在一定范围内。伽罗华域GF(2w)​代表所有运算结果只能在[0,2w)​之间。

伽罗华域的加法和减法为异或运算,乘法和除法需要基于生成多项式计算出gfilog表。GF(24)的gfilog表如下所示。
在这里插入图片描述
以8*9为例,计算过程如下所示,需要注意如果值大于2w,需要模2w。
在这里插入图片描述
更多优化
范德蒙德矩阵求逆矩阵的时间复杂度为O(N3),柯西矩阵求逆矩阵的时间复杂度为O(N2),因此可以采用柯西矩阵替代范德蒙德矩阵用于编码运算。

相关文章

python3中的type与object

python3中的type与object

在python中...

Python Sphinx使用踩坑记录

描述 使用 pip 安装sphinx后,按照教程建立了一个新的py文件,如下 # run.py def run(name):...

python约束 与MD5加密写法

python 中约束写法有两种 1 常用的通过继承关系主动抛出异常 2 通过抽象类+抽象方法 1 常用的通过继承关系主动抛出异常写法 在本send...

python 定制类

python 中可以使用一些函数,对类进行定制,方便我们的使用。 比如__slots__函数、__str__函数、__repr_...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。