2010-02-03 15 views
6

Moje środowisko to XP 32-bitowe. Znajduję się, gdy przydzielona pamięć ma prawie maksymalny rozmiar, 2 GB, co oznacza, że ​​dostępna jest niewielka przestrzeń wirtualna, przydział pamięci jest bardzo wolny.Który z nich jest szybszy, odczytywanie z dysku lub przydzielanie pamięci systemowej

Więc jeśli mam plik strony, moja aplikacja musi je przeanalizować. Mam dwa sposoby. Jednym jest odczytanie ich wszystkich w pamięci systemowej, a następnie wykonanie analizy. Drugim jest zachowanie bufora pamięci najpierw jako pamięci podręcznej, a następnie odczytanie części pliku strony do tego bufora, przeanalizowanie, a następnie odrzucenie, następnie odczytanie drugiej części pliku strony i zastąpienie pamięci podręcznej, wykonaj ponownie analizę.

Z profilowania wygląda na to, że drugi jest szybszy, ponieważ pozwala uniknąć kosztu czasu przydziału.

Co myślisz? Dzięki w adavance.

+1

+1 za profilowanie! – Justin

Odpowiedz

5

(1) Nie jestem pewien, czy pytanie pasuje do tytułu. Jeśli przydzielasz do 2 GB pamięci RAM w 32-bitowym systemie Windows, system prawdopodobnie wywołuje dużo pamięci na dysku i właśnie tam najpierw przyjrzę się spowolnieniu. Gdy używasz dużo pamięci, powinieneś pomyśleć o tym, że jest przechowywana na dysku (w pliku pagefile.sys), ale jest przechowywana w pamięci fizycznej. Drugi może być szybszy nie ze względu na koszt alokacji, ale ze względu na koszt użycia dużej ilości pamięci naraz. W efekcie, gdy kopiujesz plik do jednej dużej alokacji, kopiujesz jego dużą część na dysk-> dysk przez RAM, a następnie, gdy ponownie go prześlesz do analizy, ładujesz kopię z powrotem do pamięci RAM. Jeśli twoja analiza jest algorytmem jednoprzebiegowym, to jest dużo pracy nadmiarowej.

(2) Myślę, że jest to plik mmap (MapViewOfFile i znajomi w systemie Windows).

Edycja: (3) uwaga. Jeśli plik ma obecnie 1,8 GB, może być szansa, że ​​w przyszłym roku może to być 4 GB. Jeśli tak, planowałbym teraz, aby miał rozmiar większy niż 2^32 na maszynie 32-bitowej, co oznacza albo drugą opcję, albo nadal używającą MapViewOfFile, ale robiącą jedną porcję pliku o czas, a nie wszystkie naraz. W przeciwnym razie będziesz powracał do tego kodu za pierwszym razem, gdy ktoś spróbuje go na dużym pliku i zgłosi błąd.

+0

Dzięki. To interesujące. Ale mam pamięć RAM 4 GB. Z menedżera zadań dostępna fizyczna pamięć RAM wynosi 1,6 GB. Czy to nadal oznacza, że ​​w pliku strony sys zostanie umieszczona duża ilość buforów, gdy przydział będzie zbliżony do 2 GB? – Buzz

+0

Przydzielanie buforów może zakończyć się niepowodzeniem, zanim skończy się pamięć RAM. Pytanie brzmi, czy używasz 64-bitowego systemu Windows. To pozwala na użycie> 2 GB _RAM na proces_. – MSalters

+1

@MSalters: Pytający nie używa 64-bitowego systemu Windows. @Buzz: można by pomyśleć, że system Windows nie trafi na swap (w przypadku programów innych niż jałowe), zanim cała pamięć RAM będzie używana, ale nigdy nie działa w ten sposób. Możliwe, że w twoim przypadku nie ma zamiany, ale jeśli próbowałem w pełni wyjaśnić różnicę w wydajności między Twoimi opcjami, chciałbym ją wykluczyć - jako najprostszą kontrolę, upewnij się, że użycie pliku strony nie zwiększa się, program jest uruchomiony. Następnym krokiem będzie przeglądanie pamięci podręcznej CPU. Ale jak już mówiłem, zamapowałbym plik, a jeśli to najszybszy, kogo to obchodzi? ;-) –

5

Zapominasz 3d drogę - do mapowania pamięci na pliku, patrz funkcja CreateFileMapping/MapViewOfFile Jest to najbardziej szybki sposób

+0

Jest odwrotnie. Plik jest mapowany do przestrzeni adresowej procesu. – Void

0

Dlaczego kwota alokowana pamięć jest tak wysoki? Jeśli alokacja pamięci zajmie rozsądny czas, to odkryjesz, że robienie tego w pamięci jest o wiele szybsze - moim podejściem byłoby zrobienie tego w pamięci i spróbowanie znaleźć sposób na zmniejszenie użycia pamięci do punktu, w którym znowu jest szybki .

1

Najlepiej jest używać okien MapViewOfFile i podobnych funkcji (odpowiednik mmap Windows). Umożliwi to systemowi operacyjnemu zarządzanie stronicowaniem różnych części pliku.

+0

Ale jeśli mam wiele dużych plików stronicowych (1,8 GB), czy to jest w porządku? – Buzz

+0

System operacyjny zmapuje cały plik do pamięci twojego procesu, ale załaduje tylko bity pliku, którego szukasz do pamięci RAM.Dokładnie w ten sposób system operacyjny zarządza swoją przestrzenią wymiany dysku. – doron

+2

@Buzz: nie można zmapować wszystkich wielu plików 1.8GB w tym samym 32-bitowym procesie w tym samym czasie, ponieważ przestrzeń wirtualna musi zostać przydzielona, ​​nawet jeśli pamięć fizyczna jest zatwierdzana tylko w razie potrzeby. Różne pliki w różnych procesach powinny być w porządku, o ile wiem, i zawsze możesz zmapować plik w porcje (w ten sam sposób twoja druga opcja czyta porcje, ale mapuje większe kawałki). –

0

Jak widzę, sam zarządzasz stronicowaniem lub pozwól systemowi zarządzać stronicowaniem dla ciebie. W większości przypadków sugerowałbym, aby system operacyjny obsługiwał stronicowanie (używaj pamięci wirtualnej). Ponieważ mam nieufność wobec systemów operacyjnych MS, nie mogę zalecić tej techniki, chociaż twój przebieg może się różnić.

Powiązane problemy