我设法通过将数据块读入内存并使用下面显示的函数交换大端整数来解析大型二进制文件(~8Gb)。但是,我试图通过使用Boost Memory-Mapped files获得更多性能,但我无法使用endian_swap函数,因为文件以只读模式打开。有没有有效的方法来交换字节而不写原始文件?如果没有,性能会受到I / O开销的影响吗?
inline void endian_swap(unsigned short int& x)
{
x = (x>>8) |
(x<<8);
}
inline void endian_swap(unsigned int& x)
{
x = (x>>24) |
((x<<8) & 0x00FF0000) |
((x>>8) & 0x0000FF00) |
(x<<24);
}
inline void endian_swap(unsigned long long int& x)
{
x = (((unsigned long long int)(x) << 56) | \
(((unsigned long long int)(x) << 40) & 0xff000000000000ULL) | \
(((unsigned long long int)(x) << 24) & 0xff0000000000ULL) | \
(((unsigned long long int)(x) << 8) & 0xff00000000ULL) | \
(((unsigned long long int)(x) >> 8) & 0xff000000ULL) | \
(((unsigned long long int)(x) >> 24) & 0xff0000ULL) | \
(((unsigned long long int)(x) >> 40) & 0xff00ULL) | \
((unsigned long long int)(x) >> 56));
}
在此article上找到了代码。 非常感谢你的时间
答案 0 :(得分:2)
至少底层操作系统支持您所需的行为:
MAP_PRIVATE
Create a private copy-on-write mapping. Updates
to the mapping are not visible to other processes
mapping the same file, and are not carried through
to the underlying file. It is unspecified whether
changes made to the file after the mmap() call are
visible in the mapped region.
priv
标记似乎转换为MAP_PRIVATE
:
void* data =
::BOOST_IOSTREAMS_FD_MMAP(
const_cast<char*>(p.hint),
size_,
readonly ? PROT_READ : (PROT_READ | PROT_WRITE),
priv ? MAP_PRIVATE : MAP_SHARED,
handle_,
p.offset );
if (data == MAP_FAILED)
cleanup_and_throw("failed mapping file");