Linux: Большой массив целых чисел: mmap vs seek file?

Предположим, у меня есть набор данных, который представляет собой массив из 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?

15
задан Andrew Tomazos 14 June 2012 в 11:58
поделиться