Linux: Duża tablica int: mmap vs plik wyszukiwania?
Załóżmy, że mam zestaw danych, który jest tablicą 1e12 32-bitowych int (4 TB) przechowywanych w pliku na systemie plików 4 TB HDD ext4.
Uważaj, że dane są najprawdopodobniej losowe (lub przynajmniej wydają się losowe).
// pseudo-code
for (long long i = 0; i < (1LL << 40); i++)
SetFileIntAt(i) = GetRandInt();
Ponadto, rozważ, że chcę odczytywać poszczególne elementy int w nieprzewidywalnej kolejności i że algorytm działa w nieskończoność (jest w toku).
// pseudo-code
while (true)
UseInt(GetFileInt(GetRand(1<<40)));
Jesteśmy na Linuksie x86_64, gcc. Możesz założyć, że system ma 4 GB pamięci RAM (tj. 1000x mniej niż zestaw danych)
Poniżej przedstawiono dwa sposoby dostępu architekta:
(A) mmap plik do 4 TB bloku pamięci i uzyskaj do niego dostęp jako tablicę int
(B) otwórz (2) plik i użyj metody seek (2) i przeczytaj (2), aby odczytać wartości int.
Z A i B, które będą miały lepszą wydajność? I dlaczego?
Czy istnieje inny projekt, który zapewni lepszą wydajność niż A lub B?