Kiedy używać plików mapowanych pamięcią?

Mam aplikację, która odbiera fragmenty danych przez Sieć i zapisuje je na dysk. Po otrzymaniu wszystkich kawałków, mogą być dekodowane / łączone do jednego pliku, który faktycznie reprezentują.

Zastanawiam się, czy warto używać plików mapowanych pamięcią , czy nie-najpierw do zapisywania pojedynczych kawałków na dysk, drugi do pojedynczego pliku, do którego wszystkie są dekodowane.

Moje własne odczucie jest takie, że może się przydać tylko w drugim przypadku, każdy ma jakieś pomysły na to?

Edytuj: To aplikacja C#, a ja planuję tylko wersję x64. (Więc napotkanie problemu "największego contious wolnego miejsca" nie powinno być istotne)

Author: skaffman, 2009-12-07

3 answers

Pliki mapowane w pamięci są korzystne dla scenariuszy, w których stosunkowo mała część (widok) znacznie większego pliku musi być wielokrotnie dostępna.

W tym scenariuszu system operacyjny może pomóc w optymalizacji ogólnego zużycia pamięci i zachowania stronicowania aplikacji poprzez stronicowanie tylko ostatnio używanych części zmapowanego pliku.

Ponadto pliki mapowane pamięcią mogą ujawniać ciekawe funkcje, takie jak kopiowanie przy zapisie lub służyć jako podstawa współdzielona pamięć.

Dla Twojego scenariusza, pliki mapowane pamięcią mogą pomóc w złożeniu pliku, jeśli kawałki dotrą Nie w porządku. Jednak nadal musisz znać ostateczny Rozmiar pliku z wyprzedzeniem.

Ponadto, powinieneś mieć dostęp do plików tylko raz, aby napisać kawałek. W związku z tym przewaga wydajnościowa nad jawnie zaimplementowanymi asynchronicznymi We/Wy jest mało prawdopodobna, ale poprawne wdrożenie edytora plików może być łatwiejsze i szybsze.

W. NET 4 Microsoft dodał obsługę dla pliki mapowane pamięcią i jest kilka obszernych artykułów z przykładowym kodem, np. http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx.

 27
Author: user33675,
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
2016-08-23 15:53:00

Pliki mapowane w pamięci są używane głównie do komunikacji między procesami lub poprawy wydajności We / Wy.

Czy w Twoim przypadku starasz się uzyskać lepszą wydajność we / wy?

Nie chcę zwracać uwagi na obłudę, ale Wikipedia daje dobre podsumowanie sytuacji... http://en.wikipedia.org/wiki/Memory-mapped_file

Konkretnie...

Podejście mapowane pamięcią ma swój koszt w drobnych błędach strony - gdy blok danych jest ładowany do pamięci podręcznej strony, ale nie został jeszcze zmapowany do wirtualnej przestrzeni pamięci procesu. W zależności od okoliczności, We/Wy mapowane w pamięci mogą być znacznie wolniejsze niż standardowe we/wy.

Wygląda na to, że masz zamiar przedwcześnie zoptymalizować prędkość. Dlaczego nie zwykłe podejście do plików, a następnie refaktorowanie plików MM później, jeśli zajdzie taka potrzeba?

 12
Author: kervin,
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-12-07 11:24:18

Powiedziałbym, że oba przypadki są istotne. Po prostu zapisz pojedyncze kawałki do ich właściwego miejsca w pliku mapowanym pamięcią, Nie w porządku, jak się pojawią. To oczywiście jest przydatne tylko wtedy, gdy wiesz, gdzie każdy kawałek powinien pójść, jak w programie do pobierania bittorrent. Jeśli musisz wykonać dodatkową analizę, aby wiedzieć, gdzie powinien się udać fragment, korzyści z pliku mapowanego pamięcią mogą nie być tak duże.

 3
Author: Prof. Falken,
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
2015-01-15 08:25:51