我正在开发的一个软件输出了相当多的文件,这些文件存储在服务器上。在它的运行时,我有一个文件在我身上损坏。这些文件对操作至关重要,因此不会发生这种情况。因此,我试图想出一种向文件添加纠错的方法,以防止这种情况再次发生。
我已经阅读了里德-所罗门,它对k个数据块加上m个奇偶校验块进行编码,然后可以重建多达m个丢失的块。因此,我的想法是将数据流拆分成这些数据块,然后将它们按顺序存储在磁盘上,首先是数据块,然后是奇偶校验块。重复上述操作,直到存储完整个文件。当然,k、m和块大小都是我必须研究和尝试的变量。
然而,据我所知,Reed-Solomon要求您知道哪些块是损坏的。我怎么可能知道呢?我的想法是,在编写代码块时,我必须向每个块添加一些额外的、更简单的错误检测代码,否则我无法知道它们是否已损坏。就像CRC32之类的。
我是否正确理解了这一点,或者是否有更好的方法来实现这一点?
发布于 2020-06-03 00:21:48
这是一个有点老的问题,但(在我看来)总是有用的,在某些情况下是必要的。位腐烂永远不会被完全治愈(闭嘴ZFS社区;ZFS只有在它存在的时候才能控制它的文件系统上的内容),所以我们总是必须想出主动的预防和恢复计划。
虽然它的设计目的是促进盗版(特别是在新闻组中以块的形式存储和提取多GB的文件,其中任何块都可能丢失或损坏),但"Parchives“实际上正是您正在寻找的(see the white paper,尽管不要直接实现该方案,因为它有一个错误和更新的方案可用),它们在实践中的工作方式如下:
当完整性检查(通常在文件传输的另一端)时,完整的文件被输入编码器
.par文件,这些块被重新检查,并且需要用于重建丢失数据的任何块被从.par文件中拉出。事情最终确定为"PAR2“(本质上是具有附加功能的重写),其方案如下:
bigfile.PAR2)。这没有恢复区块。bigfile.vol029+25.PAR2、bigfile.vol104+88.PAR2等)并存。.rar文件并运行完整性检查,并返回一个MB计数,该计数表示下载的数据量等于或大于现在没有文件系统层,使用Parchive工具实现这个系统仍然相当简单,但它有两个要求:
文件不会更改的拷贝(因为对磁盘上文件的任何更改都会使奇偶校验数据无效)(当然,您也可以执行此操作,并通过更改时拷贝来增加复杂性scheme))
时,您将同时运行文件生成和完整性检查/
由于所有的数学和方法都是已知的并且经过了实战测试,您也可以使用自己的方法来满足任何需要(作为文件读/写的钩子,跨越任意路径深度,将恢复数据存储在单独的驱动器上,等等)。有关初始提示,请参阅pros:https://www.backblaze.com/blog/reed-solomon/
编辑:导致我提出这个问题的同一项研究将我带到了之前没有意识到的已经完成的工作的整个子集
https://stackoverflow.com/questions/40317843
复制相似问题