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?