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


    前言

    在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 ext{$\%$15}}=x^2=4 ]

    更多优化

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

  • 相关阅读:
    西门子PLC 8种入门实例接线与控制
    安全继电器工作原理、接线图、使用方法图解
    RKNN--群聊天
    技术分享 | 无人机上仅使用CPU实时运行Yolov5?(OpenVINO帮你实现)(上篇)
    (博途)S7-300PLC传送带工件计数控制程序设计
    Adaptive Mixture Regression Network with Local Counting Map for Crowd Counting
    配色网站收集(持续更新...)
    VUE项目里个性化写个时间轴组件,带折叠效果
    纯CSS画尖角符号
    Docker部署
  • 原文地址:https://www.cnblogs.com/zhenlingcn/p/10366644.html
Copyright © 2020-2023  润新知