映射非常大的文件

映射非常大的文件

我有一个非常大的磁盘驱动器 (2TB),但内存不是很大 (8GB)。我希望能够对磁盘文件系统上存在的大文件(~200GB)运行一些大数据实验。我知道这在磁盘带宽方面会非常昂贵,但我不介意高 I/O 使用率。

如何将这个大文件加载到 C++ 数组中,以便我可以在我选择的位置对文件执行读取和写入操作? mmap 可以用于此目的吗?我应该使用哪些参数选项来执行此操作?我不想在运行程序的任何时候触发 OOM 杀手。

我知道 mmap 支持文件支持和匿名映射,但我不完全确定使用哪个。使用私有映射与共享映射之间怎么样?

答案1

只有使用文件支持的映射来 mmap 文件才有意义,而匿名映射则没有意义。如果您想写入映射内存并将更改写回文件,那么您需要使用共享映射。使用文件支持的共享映射,您无需担心 OOM 杀手,因此只要您的进程是 64 位,只需将整个文件映射到内存中就没有问题。 (即使你不是 64 位,问题也将是缺乏地址空间,而不是缺乏 RAM,因此 OOM 杀手仍然不会影响你;你的 mmap 只会失败。)

相关内容