C / C ++中大文件二进制数据的逻辑运算

时间:2011-09-26 19:22:39

标签: c++ c

我有两个二进制文件(数十MB的顺序),我想要或这些文件的每一点。当然,我希望它尽可能高效。

所以我有两种方法可以做到这一点,但我仍然认为(我有点觉得)应该是一种我不知道的更有效的方法。

给定文件a和b ..我想要做的是a = a | b

  1. 加载两个文件,将它们解析为两个巨大的std :: bitsets和/或它们
  2. 逐个字节地加载两个文件,或者如果是一个巨大的for循环,则加载它们......
  3. 还有其他办法吗?

3 个答案:

答案 0 :(得分:6)

不要逐字节。那会非常慢。而是以块的形式读取文件。找出系统的块大小(4k?8K?64k?)并使用该大小的块读取文件。然后你可以遍历内存中的字节流并在那里进行OR操作。

从逻辑上讲,即使您一次只能读取一个字节,操作系统仍然会读取整个块的数据,然后丢弃除了您想要的字节之外的所有数据。下一次围绕该块将被缓存,但它仍然会遍历您想要的每个字节的完整读取动作。所以...只需将整个块吸入内存并节省自己浪费的开销。

答案 1 :(得分:3)

我建议一次将两个文件加载一个块,其中一个块是数据的一部分。最佳大小取决于您的操作系统和文件系统,但它通常类似于群集大小,或者2 *群集大小等等......您必须运行一些测试来确定最佳缓冲区大小。

答案 2 :(得分:0)

我认为你不会有任何性能优势(如果在你的“第二个选项”中你将以大块的形式加载文件),毕竟你将使用一个大堆栈分配的缓冲区两种情况(std::bitset归结为),所以请选择你最喜欢的那种。

除了清晰之外,我在std::bitset::operator|=中看到的唯一优势是它可能能够利用某些特定于平台的技巧或大字节序列,但我认为编译器能够优化无论如何,你的大“或循环”。