Linux:大型int数组:mmap vs seek文件?

And*_*zos 15 linux memory filesystems memory-management x86-64

假设我有一个数据集,它是一个1e12 32位整数(4 TB)的数组,存储在4TB HDD ext4文件系统的文件中.

考虑到数据很可能是随机的(或者至少是随机的).

// pseudo-code
for (long long i = 0; i < (1LL << 40); i++)
   SetFileIntAt(i) = GetRandInt();
Run Code Online (Sandbox Code Playgroud)

此外,考虑到我希望以不可预测的顺序读取单个int元素,并且该算法无限运行(它正在进行中).

// pseudo-code
while (true)
   UseInt(GetFileInt(GetRand(1<<40)));
Run Code Online (Sandbox Code Playgroud)

我们在Linux x86_64,gcc上.您可以假设系统有4GB的RAM(即比数据集少1000x)

以下是架构访问的两种方法:

(A)将文件mmap到4TB内存块,并将其作为int数组访问

(B)打开(2)文件并使用seek(2)和read(2)来读取整数.

A和B中哪个会有更好的性能?为什么?

是否有其他设计可以提供比A或B更好的性能?

Sim*_*ter 1

我想说,如果访问确实是随机的,性能应该相似。无论数据页是从文件映射还是文件数据只是缓存而不与 RAM 关联,​​操作系统都将使用类似的缓存策略。

假设缓存无效:

  • 您可以使用fadvise提前声明您的访问模式并禁用预读。
  • 由于地址空间布局随机化,虚拟地址空间中可能不存在 4 TB 的连续块。
  • 如果您的数据集不断扩大,地址空间问题可能会变得更加紧迫。

所以我会选择显式阅读。