ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-02-12 18:51:34  阅读:470  来源: 互联网

标签:删码 RS 矩阵 Inverse vander np data 浅析


前言

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

纠删码原理

纠删码基于范德蒙德矩阵实现,核心公式如下所示(AD=E)

假设某些数据丢失,右式部分行丢失,变成E',则左式也相应去掉对应行,变成A'。

函数\(Inverse[A']\)代表A'的逆矩阵,I代表单位矩阵

\[Inverse[A']*A'*D=Inverse[A']*E'​\]

\[I*D=Inverse[A']*E'​\]

\[D=Inverse[A']*E'​\]

Python实现

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(2^w)​\)代表所有运算结果只能在\([0,2^w)​\)之间。

伽罗华域的加法和减法为异或运算,乘法和除法需要基于生成多项式计算出gfilog表。\(GF(2^4)\)的gfilog表如下所示。

以8*9为例,计算过程如下所示,需要注意如果值大于\(2^w\),需要模\(2^w\)。

\[8*9=x^8 x^9=x^{17}=x^{17 \text{$\%$15}}=x^2=4\]

更多优化

范德蒙德矩阵求逆矩阵的时间复杂度为\(O(N^3)\),柯西矩阵求逆矩阵的时间复杂度为\(O(N^2)\),因此可以采用柯西矩阵替代范德蒙德矩阵用于编码运算。

标签:删码,RS,矩阵,Inverse,vander,np,data,浅析
来源: https://www.cnblogs.com/zhenlingcn/p/10366644.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有