Предположим, у меня есть набор данных, который представляет собой массив из 32-битных ints (4 ТБ) 1e12, хранящихся в файле на файловой системе 4 ТБ HDD ext4.
Учтите, что данные, скорее всего, являются случайными (или, по крайней мере, кажутся случайными).
// 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. Вы можете предположить, что система имеет 4 ГБ оперативной памяти (т.е. 1000 раз меньше, чем набор данных)
Ниже приведены два способа доступа к архитектору:
(A) mmap файл в блок памяти 4TB и получить к нему доступ как массив int
(B) откройте (2) файл и используйте поиск (2) и прочитайте (2), чтобы прочитать ints.
Из A и B, которые будут иметь лучшую производительность?, и почему?
Есть ли другой дизайн, который даст лучшую производительность, чем A или B?