我有一个非常大的磁盘驱动器 (2TB),但不是很多 RAM (8GB)。我希望能够在我的磁盘文件系统上存在的一个大文件(~200GB)上运行一些大数据实验。我知道这在磁盘带宽方面会非常昂贵,但我不介意高 I/O 使用率。
如何将这个巨大的文件加载到 C++ 数组中,以便可以在我选择的位置对文件执行读写操作?mmap 是否适用于此目的?我应该使用哪些参数选项来执行此操作?我不想在运行程序的任何时候触发 OOM 杀手。
我知道 mmap 支持文件支持和匿名映射,但我不完全确定使用哪个。使用私有映射与共享映射之间怎么样?
只有使用文件支持的映射来映射文件才有意义,而不是匿名映射。如果要写入映射内存并将更改写回文件,则需要使用共享映射。使用文件支持的共享映射,您无需担心 OOM 杀手,因此只要您的进程是 64 位,只需将整个文件映射到内存就没有问题。(即使您不是 64 位,问题也将是地址空间不足,而不是 RAM 不足,因此 OOM 杀手仍然不会影响您;您的 mmap 只会失败。)