Rezerwacja 1GB pamięci - zmiana strony

0

Cześć,
mam takie trochę techniczne pytanie:
Piszę program w C++. Powiedzmy, że rezerwuję duuużą tablicę (np. 1mln elementów) jakiś obiektów, które łącznie zajmują powiedzmy 1GB.
Obiekty maja jedynie stałe elementy tzn. nie ma w nich tablic dynamicznych.
Następnie poruszam się po tej tablicy od 0 do N-1, gdzie N-1 to ostatni index tablicy.
Robię tak nieokreśloną liczbę razy (pętla while(true)).
Pamięć RAM podzielona jest na strony - zdaje się 4KB.
A moje pytanie brzmi: jak duże znaczenie ma zmiana strony pamięci przy iterowaniu przez taką tablicę po kolei?
Tzn. gdy mam pętlę:

for(unsigned i=0; i<size; ++i) 
	DoSomethingWhtiData(tablica[i]);

to jak duże znaczenie ma zmiana danych z tablica[i] na tablica[i+1], gdy tablica[i] jest na jednej stronie a i+1 jest na drugiej stronie?

Co jeśli w takim obiekcie jest wskaźnik na inny obiekt z tej tablicy ale przesunięty o N elementów do przodu lub do tyłu?
Czy są jakieś mechanizmy, które optymalizują dostęp do danych przy tak dużych obiektach, gdy one są w jednym bloku pamięci (tablica)?

Z góry dziękuję za wyjaśnienie.

0

Aby odpowiedzieć na to pytanie musisz najpierw określić o jaki sprzęt chodzi.
Jeżeli chodzi o C++ to optymalizacją powinieneś zająć się na samym końcu o ile będzie z tym problem.
Na początku jedynie zadbaj aby nie robić ewidentnych głupot, takich jak tablica rozmiarem 1GB - bo zawsze można zamienić to na tablicę wskaźników i ten 1GB nie będzie musiał być w jednym kawałku.

0
_13th_Dragon napisał(a):

Aby odpowiedzieć na to pytanie musisz najpierw określić o jaki sprzęt chodzi.

Chodzi o zwykły komputer - powiedzmy, że taki lepszy, ale domowy. Pamięć RAM >= 8GB

_13th_Dragon napisał(a):

Na początku jedynie zadbaj aby nie robić ewidentnych głupot, takich jak tablica rozmiarem 1GB - bo zawsze można zamienić to na tablicę wskaźników i ten 1GB nie będzie musiał być w jednym kawałku.
A dlaczego uważasz, że lepiej zrobić wiele tablic porozrzucanych po pamięci niż mieć to w jednym kawałku?
Ten 1GB to pewne dane, które są wykorzystywane do pewnych analiz i istotna jest kolejność. Dlatego, że operacje na danych są wykonywane wielokrotnie stwierdziłem, że lepiej je wrzucić do pamięci RAM (1GB to jeszcze nie tak dużo), niż pobierać je na bieżąco z dysku (np. za pomocą memory mapped files).

0

Chodzi mi o to że na PC świat się nie kończy.

Wszystko zależy od używanych algorytmów obróbki.
Jeżeli możesz zrobić je wszystkie (te potrzebne tobie) za pomocą iteratorów używając wyłącznie tylko trzech operatorów: ++it, *it, it-> to znaczy że styknie ci nawet zwykła lista jednokierunkowa.
Jeżeli oprócz tego będziesz potrzebować --it to - dwukierunkowa.
Przejście po liście wcale nie jest droższe czasowo od przejścia po tablice,
Przy tym bardzo niewiele algorytmów wymagają tablicy, dobry przykład to quick sort w wersji kiedy za medianę przyjmujesz wartość środkowego elementu, ale to nie jedyny wariant tego algorytmu.
Jedynie co może istotnie przyśpieszyć działanie na tablicy to automagiczny cashe, ale z całą pewnością nie obejmie to obszaru w 1GB

0

Nawet jeżeli jeden element zajmuje 64B to w 1GB zmieści się prawie 17mln takich obiektów. Serio potrzebujesz ich wszystkich naraz?
Musisz określić jakie zadanie będzie priorytetem dla tych danych. Czy zależy Ci na szybkim manipulowaniu( wstawianie/usuwanie) czy przetwarzaniu(szukanie/odczyt).
Podziel dane według tego kto i jak będzie je używał a nie według tego do kogo należą i gdzie powinny być wg OOP.

PS. Tak, zafascynowałem się DOD :P

0

a nie można do tego uzyć biblioteki <vector>?

1

Powinieneś opisać problem jaki próbujesz rozwiązać (co dokładnie ma robić aplikacja).
Doświadczenie uczy, że początkujący często wymyślają niestworzone rozwiązania, a potem proszą o naprawianie szalonego pomysłu.
Potem po tygodniu i wielu dyskusjach się okazuje się, że można coś było zrobić inaczej prościej i skuteczniej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1