C/ c++中对大文件二进制数据的逻辑运算
logical operations on large files binary data in C/C++
我有两个二进制文件(数量级为几十MB),我想要访问这些文件的每一位。当然,我希望它尽可能高效。
所以我有两种方法来做到这一点,但我仍然认为(我有点觉得)应该是一个更有效的方法,我不知道。
给定文件a和b ..我要做的是a = a|b
- 加载两个文件,将它们解析成两个巨大的std::bitset并将它们放在一起
- 一个字节一个字节地加载两个文件,如果有一个巨大的for循环…
还有其他方法吗?
不要逐字逐句。那将是非常缓慢的。相反,应该以块的形式读取文件。找到适合您的系统的块大小(4k?8 k ?64k?),并使用该大小的块读取文件。然后你可以循环遍历内存中的字节流并在那里执行OR操作。
在逻辑上,即使你可能一次只读取一个字节,操作系统仍然会读取整个数据块的价值,然后扔掉除了你想要的字节。下一次,这个块将被缓存,但它仍然会为你想要的每个字节经历完整的读取过程。所以…
我建议一次一个块加载这两个文件,其中块是数据的适当部分。最佳大小取决于您的操作系统和文件系统,但通常是集群大小,或者2 *集群大小,等等……您必须运行一些测试来确定最佳的缓冲区大小。
我不认为你会有任何性能上的优势(如果在你的"第二种选择"中,你要在大块中加载文件),毕竟在这两种情况下你都会使用一个大的堆栈分配缓冲区(这就是std::bitset
归结为),所以用你最喜欢的一个。
我在std::bitset::operator|=
中看到的唯一优点,除了清晰度之外,是它可能能够利用一些平台特定的技巧来或大字节序列,但我认为编译器无论如何都能够优化您的大"或循环"。
相关文章:
- 如何从dicom文件中读取二进制数据
- 如何在Qt中从数据库中检索二进制数据?
- readsome() 适合在 Windows 上读取二进制数据吗?
- 如何使用 redis-plus-plus 存储二进制数据,就像我想存储结构一样?@for_stack?
- 将包含二进制数据的 QByteArray 传递到按值运行
- 如何在 c++ 中生成十六进制二进制数据的 sha256 哈希?
- 在处理网络、二进制数据和序列化时应使用流或容器
- 我能确定从文件中读取的 32 字节二进制数据等于 256 位吗?
- C++:如何通过 curl 调用使用 HTTP post 请求发送二进制数据(protobuf 数据)
- 使用二进制数据更新 PostgreSQL 表
- 使用二进制数据和无符号字符
- sd_journal_send发送二进制数据.如何使用日志检索数据?
- 从带有 std::ifstream::read() 的文件中读取 int 遍历 char * 二进制数据
- 将文本和二进制数据连接到一个文件中
- 二进制模式 + 格式化文本操作或文本模式 + 二进制数据操作 - 有意义吗?
- 将整数的二进制数据转换为浮点数
- 使用 CMake 在可执行文件中嵌入二进制数据
- 二进制数据作为命令行参数
- 如何访问文件的二进制数据?
- 返回二进制数据的通用方式,而无需原始指针