Предположим, у меня есть набор данных, который представляет собой массив из 1e12 32-битных целых чисел (4 ТБ), хранящихся в файле на файловой системе ext4 жесткого диска емкостью 4 ТБ..
Учтите, что данные, скорее всего, случайные (или, по крайней мере, кажется случайным).
// 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 файл на блок памяти 4 ТБ и доступ к нему как к массиву int
(B) открыть(2) файл и использовать seek(2) и read(2) для чтения целых чисел.
Что из A и B будет иметь лучшую производительность? и почему?
Существует ли другой дизайн, обеспечивающий лучшую производительность, чем A или B?