通过“嘈杂”数据流发送和接收数据

时间:2009-12-14 00:20:23

标签: java algorithm

我的Java程序将其数据保存到二进制文件中,并且(非常)文件由于硬件故障而偶尔会损坏。通常,在几兆字节的文件中只影响几个字节。为了解决这个问题,我可以将数据写两次,但这似乎有点过分了 - 我宁愿将文件大小增加到约20%。

在我看来,这类似于通过'嘈杂'数据流发送信息的问题。是否有可以将冗余信息写入输出流的Java库或算法,以便接收器可以在引入噪声时恢复?

5 个答案:

答案 0 :(得分:8)

您想要的是错误纠正码。请检查此代码:http://freshmeat.net/projects/javafec/

同样,维基百科文章可能会为您提供更多信息: http://en.wikipedia.org/wiki/Forward_error_correction

您的两种可能性是前向纠错,您可以在其中发送冗余数据,或者用于错误检测的系统,您可以在其中检查哈希值并重新请求任何已损坏的数据。如果腐败是预期的事情,那么纠错就是采取的方法。

如果不了解您的环境的性质,提供更具体的建议实际上是不可能的,但这应该让您开始知道如何解决这个问题。

答案 1 :(得分:2)

纠正代码错误。如果我没记错的话,附加位的数量作为块大小的log n,所以越大的块就越少,校正位就越少。

您应该选择一种在普通文本之间交叉检查位(可能最方便的额外字符)的机制。这允许在数据流中具有可修复的漏洞,同时仍然可读。

答案 2 :(得分:1)

嘈杂的通信问题已经有了一个很好的解决方案:发送数据的哈希/ CRC(带有数据),接收器(重新)评估,如果路由损坏则重新请求。

换句话说:使用哈希算法检查损坏并在必要时重新传输,而不是冗余地发送数据。

答案 3 :(得分:1)

CRC和ECC是检测和(对于ECC)从噪声引起的数据损坏中恢复的原因。但是,任何方案都只能应付一定程度的噪音。超出该级别,您将得到未检测到的和/或无法纠正的错误。第二个问题是,只有在注入噪声之前添加ECC / CRC,这些方案才有效。

但是我有点怀疑你可能正试图解决错误的问题:

  • 如果通过通信线路传输文件时发生损坏,那么您应该使用具有内置ECC等支持的通信硬件。

  • 如果在将文件写入光盘时发生损坏,则应更换光盘。

  • 您还应该考虑您的应用程序破坏数据的可能性;例如由于您的代码中存在一些同步错误。

答案 4 :(得分:0)

声音陈旧,但很有趣,我只是与编写“移动”应用程序(不是PDA /手机,而是石油和天然气钻井平台式现场应用程序)的人进行了类似的对话。由于环境,他们实际上在修改后的XMODEM CRC传输中写入磁盘。我认为很容易说除了:

之外没什么特别之处

在“rw”中使用RandomAccessFile写入一个数据块(512-4096字节),重新读取用于CRC校验,如果不匹配则重写,或迭代到下一个块。使用OS文件缓存我很好奇这是多么有效?