使用 Python3 的 Reed-Solomon 代码用于大数据

问题描述

我正在编写一个代码来使用 Reed-Solomon 代码10MB 二进制数据进行编码。

但是,模块会抛出有关消息长度的错误,如下面的警告。

ValueError: Message is too long (10032003 when max is 255)

虽然我试图理解图书馆的代码,但我无法理解代码的用途。

你能帮我解决这个问题吗?

这是我编写以下代码时的 Reed-Solomon Module

以下代码是我编写的代码的一部分。

import time
import reedsolo as rs

def encoding(per,msg,n,nsym,gen):
    time = 0
    count = 0

    rs.init_tables(0x11d)
    while time < per:
        temp = time.time()
        rs.rs_encode_msg(msg,gen=gen[nsym])

        time += time.time() - temp
        count += 1

def main():
    data = b"<SOME TEXT>"*5500 #This data size is 10MB
    n = 8
    nsym = 3 # I wanted RS(8,3)
    period = 10


    gen = rs._rs_generator_poly_all(n)
    encoding(period,data,8,3,gen)

解决方法

我建议使用一种类似于 jerasure 的方法,用于云存储。把数据看成一个矩阵,5行数据,3行ECC(RS(8,5)共8个,5个数据,3方),其中每行有ncol = 10MB/5(ncol是列数)。对每一列数据独立使用 RS 代码。您可能需要考虑更多行,例如 16 行数据、4 行 ECC (RS(20,16))。

错误检测+纠正过程需要将列转换为数组并调用RS库进行编码和解码,并将结果转换回列。

您需要使用编译库而不是基于 Python 的库,以便代码运行得足够快。通过使用使用 PSHUFB(xmm 寄存器)指令一次并行处理 16 个字节的汇编模块,可以加速 X86 的编译库。

问题中链接的github库包含一个要编译的C源文件,但我不知道为python创建C编译库需要什么工具。