Jak duży może być plik mapowany pamięcią?

Co ogranicza Rozmiar pliku mapowanego pamięcią? Wiem, że nie może być większy niż największy ciągły kawałek nieprzydzielonej przestrzeni adresowej i że powinno być wystarczająco dużo wolnego miejsca na dysku. Ale czy są inne ograniczenia?

Author: MarkusQ, 2009-04-07

7 answers

Jesteś zbyt konserwatywny: plik mapowany pamięcią może być większy niż przestrzeń adresowa. Widok pliku mapowanego pamięcią jest ograniczony ograniczeniami pamięci systemu operacyjnego, ale to tylko część pliku, na którą patrzysz w tym samym czasie. (I myślę, że technicznie można odwzorować wiele widoków nieciągłych części pliku na raz, więc oprócz ograniczeń narzutu i długości strony, tylko całkowita liczba bajtów, na które patrzysz, stanowi limit. Można spojrzeć na bajty [0 do 1024] i bajtów [240 na 240 + 1024] z dwoma oddzielnymi widokami.)

W MS Windows spójrz na funkcję MapViewOfFile . Efektywnie zajmuje 64-bitowe przesunięcie pliku i 32-bitową długość.

 24
Author: Jason S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-07 16:17:09

To było moje doświadczenie podczas korzystania z plików mapowanych pamięcią pod Win32:

Jeśli zmapujesz cały plik do jednego segmentu, zwykle pobiera on około 750 MB, ponieważ nie może znaleźć większego sąsiedniego bloku pamięci. Jeśli podzielisz go na mniejsze segmenty, powiedzmy 100MB każdy, możesz uzyskać około 1500MB-1800MB w zależności od tego, co jeszcze działa.

Jeśli używasz przełącznika /3G możesz uzyskać więcej niż 2GB do około 2700mb, ale wydajność OS jest ukarany.

Nie jestem pewien co do 64-bitów, nigdy tego nie próbowałem, ale zakładam, że maksymalny rozmiar pliku jest wtedy ograniczony tylko ilością fizycznej pamięci.

 9
Author: Alan Clark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-27 10:09:46

Nie powinno być żadnych innych ograniczeń. Czy to nie wystarczy? ;-)

 1
Author: dwc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-07 16:08:51

W systemie Windows: "Rozmiar widoku pliku jest ograniczony do największego dostępnego sąsiedniego bloku nieograniczonej pamięci wirtualnej. Jest to co najwyżej 2 GB minus pamięć wirtualna już zarezerwowana przez proces. "

Z MDSN .

Nie jestem pewien co do Linuksa / OSX / czegokolwiek innego, ale prawdopodobnie jest to również związane z przestrzenią adresową.

 1
Author: Furious Coder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-07 16:12:21

Z FUSE na Linuksie można również utworzyć system plików w pamięci, który rozszerza się na dysk na żądanie. Nie jestem pewien, czy to kwalifikuje się do mapowania pamięci, a rozróżnienie się zamazuje.

 0
Author: krosenvold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-07 16:18:49

Tak, istnieją ograniczenia dla plików mapowanych w pamięci. Najbardziej szokujące jest:

Pliki mapowane w pamięci nie mogą być większe niż 2 GB w systemach 32-bitowych.

Gdy memmap powoduje utworzenie lub rozszerzenie pliku poza jego bieżący rozmiar w systemie plików, zawartość nowej części jest nieokreślona. W systemach z semantyką systemu plików POSIX Rozszerzona część będzie wypełniona zerowymi bajtami.

Nawet na moim 64-bitowym, 32GB RAM systemie, dostaję następujący błąd, jeśli próbuję aby odczytać w jednym dużym pliku mapowanym pamięcią numpy, zamiast pobierać jego fragmenty za pomocą offsetów bajtowych:

Overflow Error: memory mapped size must be positive

[1]}duże zbiory danych są naprawdę trudne do pracy.
 0
Author: JYun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-09 17:55:23
 -3
Author: Scott and the Dev Team,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-07 16:21:59