2017-06-15 19 views
1

我运行了一个大量的处理工作,产生了大量的二进制文件作为输出。我想我现在意识到我的输出数据文件被损坏了,因为在将数据文件移动到远程存储器之前,我没有正确地刷新或关闭对象boost::archive::binary_oarchive。我想知道是否有任何方法通过在输出数据文件中添加一些特殊的EOF事件来修复输出数据文件,或者我运气不好,而且我必须重新运行昂贵的工作?有什么办法可以修复由于没有正确关闭boost :: archive :: binary_oarchive而损坏的文件吗?

更具体地说,我的处理作业转储二进制数据,像这样:

void dumpStuff() { 
     // some code 
     std::ofstream ofs(localFileName); 
     boost::archive::binary_oarchive boa(ofs); 
     boa << *data; 

     if (uploadToRemote) { 
      // code that uploads files to remote store 
      // does not run when I tested locally 
     } 
    } 

我认为情况是,当我本地测试(并没有上传到远程),该boa对象超出范围在dumpStuff函数结尾,所以它的析构函数被调用,它正确地刷新流并关闭文件。然而,当上传到远程存储时,上传发生在oba的析构函数被调用之前,因此我认为该流没有正确刷新,导致文件损坏。当我从商店获取损坏的文件并尝试加载boost::archive::binary_iarchive时,我得到一个InputStreamError

我知道我可以通过在boa的东西上加上一些大括号来强制它在远程上传之前超出范围来解决问题,但是,如果我重新运行这个昂贵的工作,这只会解决我的问题。所以,我的问题是,是否有一些简单的方法可以将某些内容附加到我的损坏文件的末尾以清除它们?某种EOF信号?

+0

我可能会为了重新运行大型工作而权衡任何开发费用。在大多数情况下,重新运行它最终会更便宜。而且无论如何更具可预测性。自从在SO上发布此问题后,您已经失去了8个小时(假设您没有开始重新运行) – sehe

+0

这是一个远射。您可以修改反序列化例程的顶层(通常称为“load”)来检测不一致的值(例如非常大的整数)并停止反序列化。您最终将得到一些无效状态的值,但可能有99%的信息要恢复。 – alfC

+0

“有没有办法修复由于没有正确关闭”No.“而损坏的文件... boost :: archive :: binary_oarchive?”无关紧要。 – EJP

回答

2

有可能没有。然后,它的大部分将肯定取决于您使用的底层流的冲洗行为。

这是一次性问题,只有你有,所以你将不得不作出解决。

  • 一种方法是查看源代码以确定由于缺少关闭而会跳过哪些操作。然后补偿丢失的输入或者使输入 - 归档实现更容忍损坏/丢失的尾部。

  • 另一种方法是使用你自己的代码来编写一个档案,然后编写SAME档案,但修正了错误。

    看看十六进制编辑器的区别。您可能很幸运,发现归档中缺少的数据是固定的。如果是这样,只需将其附加到任何损坏的输入流并很高兴。更有可能你会有一些(简单的)可变数据,比如校验和或总大小。在这种情况下,要么尝试生成缺失的数据,要么破解输入流实现来检测所需的校验和。

警告:所有这些建议与无证细节插手,也不会有支持,可靠性完全取决于你自己的准确度。

如果选择“假”的校验,做到心中有数,它阻挠任何内建的错误检测的事实,所以你可能也看不可靠的数据(如果有在sotrage /过境损坏的数据)

+1

好想法生成差异。我可能会尝试在几个文件中查看是否存在某种模式,但最终我倾向于咬紧牙关并重新运行计算。感谢您的答复。 – ChocolateAndCheese

相关问题