问题描述
我正在编写一个代码来使用 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编译库需要什么工具。