首页 > 解决方案 > 用于大数据的 Python3 的 Reed-Solomon 代码

问题描述

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

但是,该模块会引发有关消息长度的错误,如以下警告。

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

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

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

这是我编写以下代码时的Reed-Solomon 模块。

以下代码是我制作的部分代码。

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, nsym, 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)

标签: pythonerror-correctionreed-solomon

解决方案


我会建议一种类似于用于云存储的 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 编译库需要哪些工具。


推荐阅读