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

logical operations on large files binary data in C/C++

本文关键字:二进制 数据 逻辑运算 文件 c++      更新时间:2023-10-16

我有两个二进制文件(数量级为几十MB),我想要访问这些文件的每一位。当然,我希望它尽可能高效。

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

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

  1. 加载两个文件,将它们解析成两个巨大的std::bitset并将它们放在一起
  2. 一个字节一个字节地加载两个文件,如果有一个巨大的for循环…

还有其他方法吗?

不要逐字逐句。那将是非常缓慢的。相反,应该以块的形式读取文件。找到适合您的系统的块大小(4k?8 k ?64k?),并使用该大小的块读取文件。然后你可以循环遍历内存中的字节流并在那里执行OR操作。

在逻辑上,即使你可能一次只读取一个字节,操作系统仍然会读取整个数据块的价值,然后扔掉除了你想要的字节。下一次,这个块将被缓存,但它仍然会为你想要的每个字节经历完整的读取过程。所以…

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

我不认为你会有任何性能上的优势(如果在你的"第二种选择"中,你要在大块中加载文件),毕竟在这两种情况下你都会使用一个大的堆栈分配缓冲区(这就是std::bitset归结为),所以用你最喜欢的一个。

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