Linux: Großes int Array: mmap vs seek Datei?

Angenommen, ich habe einen Datensatz, der aus einem Array von 1e12 32-Bit-Ints (4 TB) besteht und in einer Datei auf einem 4 TB HDD ext4-Dateisystem gespeichert ist.

Bedenken Sie, dass die Daten höchstwahrscheinlich zufällig sind (oder zumindest zufällig erscheinen).

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

Denken Sie außerdem daran, dass ich einzelne int-Elemente in einer unvorhersehbaren Reihenfolge lesen möchte und dass der Algorithmus unbegrenzt ausgeführt wird (er ist noch nicht abgeschlossen).

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

Wir sind auf Linux x86_64, gcc. Sie können davon ausgehen, dass das System 4 GB RAM hat (dh 1000x weniger als der Datensatz).

Es gibt zwei Möglichkeiten für den Architektenzugriff:

(A) Ordnen Sie die Datei einem 4-TB-Speicherblock zu und greifen Sie als int-Array darauf zu

(B) öffne (2) die Datei und benutze seek (2) und read (2), um die Ints zu lesen.

Von A und B welche haben die bessere Leistung? Und warum?

Gibt es ein anderes Design, das eine bessere Leistung bietet als A oder B?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage