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更好的性能?
我想说,如果访问确实是随机的,性能应该相似。无论数据页是从文件映射还是文件数据只是缓存而不与 RAM 关联,操作系统都将使用类似的缓存策略。
假设缓存无效:
fadvise提前声明您的访问模式并禁用预读。所以我会选择显式阅读。