假设我有一个数据集,它是一个存储在 4TB HDD ext4 文件系统上的文件中的 1e12 32 位整数(4 TB)数组。
考虑到数据很可能是随机的(或者至少看起来是随机的)。
// pseudo-code
for (long long i = 0; i < (1LL << 40); i++)
SetFileIntAt(i) = GetRandInt();
此外,考虑到我希望以不可预测的顺序读取单个 int 元素,并且该算法不确定地运行(它正在进行中)。
// pseudo-code
while (true)
UseInt(GetFileInt(GetRand(1<<40)));
我们在 Linux x86_64、gcc 上。您可以假设系统有 4GB 的 RAM(即比数据集少 1000 倍)
以下是架构访问的两种方式:
(A) 将文件 mmap 到 4TB 的内存块,并以 int 数组的形式访问
(B) 打开(2) 文件并使用 seek(2) 和 read(2) 读取整数。
在 A 和 B 中哪一个会有更好的性能?为什么?
是否有另一种设计可以提供比 A 或 B 更好的性能?