下载和转换大型二进制文件的最快设计是什么?

时间:2010-06-18 17:09:15

标签: c++ visual-studio file

我在另一个系统上有一个1GB的二进制文件。

要求:ftp /下载并在主系统上将二进制转换为CSV。

转换后的文件幅度会大~8GB

与此类似的事情最常见的方法是什么? 这应该是一个两步独立的过程,下载 - 然后转换?
我应该一次下载小块并在下载时进行转换吗?

我不知道这样做最有效的方法......对于这么大的文件,我应该注意什么呢?

感谢任何建议。

谢谢。

(Visual Studio C ++)

6 个答案:

答案 0 :(得分:5)

我会编写一个程序,将二进制格式和输出转换为CSV格式。该程序将从stdin读取并写入stdout。

然后我会打电话给

wget URL_of_remote_binary_file --output-document=- | my_converter_program > output_file.csv

通过这种方式,您可以立即开始转换(无需下载整个文件),并且您的程序不会处理网络问题。您也可以在远程端运行该程序,假设它足够便携。

答案 1 :(得分:4)

在不知道任何细节的情况下,我会使用二进制ftp下载,然后使用单独的转换程序进行后处理。这会将过程分解为两个不同且不相关的部分,这将有助于构建和调试整个系统。无需重新发明FTP系统以及优化后处理的大量潜力。

答案 2 :(得分:3)

为了避免过多的流量,我会在第一步中压缩并传输文件。转换过程,如果出现问题或想要其他输出,可以在本地重做,而无需重新获取数据。

唯一的预防措施不是将所有内容加载到内存中然后进行转换,而是按照你所说的方式进行转换。您可以通过创建/预分配最大预期大小的巨大文件来防止对程序用户造成一些不愉快的影响。这样可以避免在转换阶段耗尽磁盘空间。另外一些文件系统不喜欢大于2GB或4GB的文件,这也会被预分配技巧捕获。

答案 3 :(得分:2)

这取决于您的数据和您的要求。你有什么性能要求?你是否需要在X时间内完成任务(速度至关重要),或者这是否会定期完成(在这种情况下速度不是必需的)?

也就是说,如果将工作分成两个任务 - 下载器和转换器,您肯定会得到更清晰的实现。这样,每个组件都可以很简单,只关注手头的任务。在所有条件相同的情况下,我推荐这种方法。

否则,如果您尝试同时下载/转换,您可能会遇到下载器已准备好数据的情况,但转换器需要更多数据才能继续。同样,没有理由说你的代码无法解决这个问题,但它会使实现变得更复杂,而且调试/测试/验证会更加困难。

答案 4 :(得分:1)

通常最好将它作为没有相互依赖性的单独进程来完成。如果您的需求在将来发生变化,您可以重复使用这些部分,或将其用于其他项目。

答案 5 :(得分:1)

以下是关于您的要求和可能的解决方案的更多猜测:

  • 关注文件完整性?实现包括完整性检查(如序列号,大小字段和校验和/哈希)以及足够的事务语义的内容,以便系统知道传输是否已完成。
  • 上传是在缓慢/拥挤的链接上发生的,是否可能会中断?实施允许在中断后恢复传输的协议。
  • 上传是否会重复出现,大部分数据都保持不变?实现适合增量更新的内容,因此只上传差异。