使用内存映射mmap 技术来减少内存拷贝。
-
减少系统调用: 直接将文件映射到内存,避免了多次读写文件时的系统调用,减少了上下文切换的开销。
-
内存共享: 通过映射,多个进程可以共享同一块内存区域,从而减少内存使用和提高访问速度。
-
按需加载: 操作系统可以根据实际需要将文件的部分内容加载到内存中,而不是一次性读取整个文件,这样可以节省内存和时间。
-
数据局部性: 一旦数据被加载到内存,后续的访问可以直接从内存中读取,提高了访问速度。
#include <iostream>
#include <fcntl.h> // open
#include <sys/mman.h> // mmap, munmap
#include <sys/stat.h> // fstat
#include <unistd.h> // close
int main() {
// 打开文件
const char* filepath = "example.txt";
int fd = open(filepath, O_RDONLY);
if (fd == -1) {
std::cerr << "Error opening file" << std::endl;
return 1;
}
// 获取文件大小
struct stat fileStat;
if (fstat(fd, &fileStat) == -1) {
std::cerr << "Error getting file size" << std::endl;
close(fd);
return 1;
}
// 使用 mmap 映射文件
size_t fileSize = fileStat.st_size;
char* mapped = (char*)mmap(nullptr, fileSize, PROT_READ, MAP_PRIVATE, fd, 0);
if (mapped == MAP_FAILED) {
std::cerr << "Error mapping file" << std::endl;
close(fd);
return 1;
}
// 访问文件内容
std::cout << "File contents:" << std::endl;
std::cout.write(mapped, fileSize);
// 解除映射和关闭文件
if (munmap(mapped, fileSize) == -1) {
std::cerr << "Error unmapping file" << std::endl;
}
close(fd);
return 0;
}