Boost. Efektywne mapowanie losowych kawałków pliku.

0

Cześć,

mam pytanie odnośnie mapowania dużych plików(>10G) z użyciem boost.

Co chcę osiągnąć?
Chcę np. najpierw przeczytać pierwszy mb pliku, potem dziesiąty i tak ciągle jakieś losowe offsety.

Teraz mam to rozwiązane tak.
Mapuję pierwszy mb.
Zwalniam (zamapowanyPlik.close())
Mapuję dziesiąty mb.
Zwalniam.
...

Nie wydaję mi się, żeby to było efektywne. Jak to robić, żeby efektywne było?

Myślałem, żeby mapować zamiast jednego mb to dziesięc mb. I jeżeli chce zamapować czwarty mb, a wcześniej już mapowałem pierwszy to ten czwarty już jest i nie trzeba go znów mapować.

Jakieś sugestie? Z góry dzięki

Pozdrawiam

1

Dopóki będzie to totalne losowe skakanie po dysku to raczej nic mądrego się tutaj nie wymyśli. Dużo może zależeć od systemu operacyjnego. Np. taki linux stosuje b. agresywną politykę cachowanie plików w RAM-ie przez co przy powtarzających się offsetach często będziesz trafiał w pamieć operacyjną a nie w dysk. Najlepiej przygotuj sobie jakiś scenariusz testowy, uruchom i dopóki wydajnosć nie będzie problemem olej sprawę.
"Premature optimization is the root of all evil"...

0

To może być lamerskie pytanie, ale dlaczego nie zmapujesz całego naraz?

0

Ok, zrobię tak jak mówi @yurai

0

W C# masz MemoryMappedFile. Jak lubisz masochizm lub jest to fragment duzego projektu to dalej uzywaj C++. MemoryMappedFiles masz zaimplementowane tutaj:
https://github.com/dotnet/corefx/tree/master/src/System.IO.MemoryMappedFiles/src
i mozesz sobie podobnie sam w C++ zaimplementowac

1

ograniczenie przestrzeni adresowej oznacza tylko tyle, że nie można widzieć całego pliku na raz, tylko trzeba mapować kawałkami, np. 1 GB.
Losujesz offset, sprawdzasz czy mieści się w aktualnie zamapowanym obszarze, jeśli tak to dobrze, jeśli nie to przesuwasz okienko nad potrzebny gigabajt.

0
stryku napisał(a):

Cześć,

Teraz mam to rozwiązane tak.
Mapuję pierwszy mb.
Zwalniam (zamapowanyPlik.close())
Mapuję dziesiąty mb.
Zwalniam.
...

Nie ma potrzeby zamykać plik co chwila, po to jest funkcja seekg() żeby się przesuwać po otwartym pliku. Połącz użycie tej funkcji z koncepcją @Azarien.

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