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

C++ 下载和转换大型二进制文件的最快设计是什么?,c++,visual-studio,file,C++,Visual Studio,File,我在另一个系统上有一个1GB的二进制文件 要求:ftp/下载并在主系统上将二进制文件转换为CSV 转换后的文件大小将大于~8GB 做类似事情最常见的方法是什么? 如果这是一个两步独立的过程,请下载-然后转换? 我是否应该一次下载小块,并在下载时转换 我不知道最有效的方法来做这件事…还有我应该注意什么与文件这种大小 任何建议都将不胜感激 多谢各位 (Visual Studio C++)这取决于您的数据和需求。您有什么性能要求?您是否需要在X时间内完成这类任务(速度至关重要),还是只需要定期完成这类

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

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

转换后的文件大小将大于~8GB

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

我不知道最有效的方法来做这件事…还有我应该注意什么与文件这种大小

任何建议都将不胜感激

多谢各位


(Visual Studio C++)

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

这就是说,如果您将工作分为两个任务——下载程序和转换器,那么您肯定会得到一个更干净的实现。这样,每个组件都可以很简单,只需专注于手头的任务。在一切平等的情况下,我推荐这种方法


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

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

通常最好将其作为独立的进程进行,而不存在相互依赖性。如果您的需求在将来发生变化,您可以重用这些片段,或者将它们用于其他项目。

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


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

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

然后我会打电话

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

这样,您可以立即开始转换(无需下载整个文件),并且您的程序不会处理网络。您也可以在远程运行该程序,前提是它具有足够的可移植性。

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

  • 关心文件完整性?实现一些包括完整性检查的东西,如序列号、大小字段和校验和/哈希,以及足够的事务语义,以便系统知道传输是否完成
  • 上传是否发生在缓慢/拥挤的链接上,并且可能被中断?实现一个协议,允许在中断后恢复传输
  • 在大部分数据保持不变的情况下,上传是否重复?实现一些可以进行增量更新的东西,这样您就可以只上传差异

我不确定自己是否完全理解如何在不下载整个文件的情况下立即开始转换。我喜欢这个想法,你能详细说明一下吗?@Tommy,
wget
不会在开始写入之前读取整个文件,它会在获得合理的文件块后立即写入。管道机制应该在转换程序可用时立即将其传递给转换程序。这是非常典型的*nix思维。@Mark-有没有办法在Windows中模拟这种情况而不下载任何新库?@Tommy,Windows中的命令窗口中有管道。您可以使用Google for Windows wget,或者如果无法下载程序,您可以使用FTP编写自己的文件传输程序。是否有两个单独的任务,但在下载足够多的文件后才开始转换,这被视为“同时下载/转换”?谢谢。很好的问题,还没到那个程度,但是关于诚信的问题是肯定的。