Linux: Large int array: mmap vs procurar arquivo?

Suponha que eu tenha um conjunto de dados que seja uma matriz de 1e12 de 32 bits ints (4 TB) armazenados em um arquivo em um sistema de arquivos 4TB HDD ext4.

Considere que os dados são provavelmente aleatórios (ou pelo menos parecem aleatórios).

// pseudo-code
for (long long i = 0; i < (1LL << 40); i++)
   SetFileIntAt(i) = GetRandInt();

Além disso, considere que desejo ler elementos int individuais em uma ordem imprevisível e que o algoritmo é executado indefinidamente (está em andamento).

// pseudo-code
while (true)
   UseInt(GetFileInt(GetRand(1<<40)));

Estamos no Linux x86_64, gcc. Você pode assumir que o sistema tem 4GB de RAM (ou seja, 1000x menos que o conjunto de dados)

A seguir estão duas maneiras de arquitetar o acesso:

(A) mapeie o arquivo para um bloco de 4 TB de memória e acesse-o como uma matriz int

(B) abra (2) o arquivo e use seek (2) e read (2) para ler os ints.

Fora de A e B, que terá o melhor desempenho? E por quê?

Existe outro design que ofereça melhor desempenho que A ou B?

questionAnswers(4)

yourAnswerToTheQuestion