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

Odpowiedz Nowy wątek
2015-02-18 20:54
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

Pozostało 580 znaków

2015-02-18 21:54
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"...


Pozostało 580 znaków

2015-02-18 22:35
0

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

Całe 10G? Ponad 10G? - stryku 2015-02-19 01:03
Chodzi o to, że program jest 32-bitowy i nie zmieści się w przestrzeni adresowej? Mogę mówić głupoty bo nigdy się tym poważnie nie zajmowałem :D - mad_penguin 2015-02-19 16:12
No mniej więcej tak :) Są jeszcze pliki wymiany, ale to i tak mało na to co chcę osiągnąć - stryku 2015-02-19 19:28
Jeśli chodzi o memory mapped file (http://en.wikipedia.org/wiki/Memory-mapped_file) to nie jest on wcale od razu cały wczytywany do RAMu, więc to może być dobre rozwiązanie. Przy czym tak, jeśli program jest 32bitowy to nie starczy wirtualnej przestrzeni adresowej. - msm 2015-02-19 21:58

Pozostało 580 znaków

2015-02-19 19:17
0

Ok, zrobię tak jak mówi @yurai

Dlaczego trzymasz tyle danych w pliku? - satirev 2015-02-19 19:33
chcę mapować partycję pod linuxem - stryku 2015-02-19 21:54

Pozostało 580 znaków

2015-02-19 19:59
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/cor[...]stem.IO.MemoryMappedFiles/src
i mozesz sobie podobnie sam w C++ zaimplementowac


░█░█░█░█░█░█░█░█░█░█░█░
Pokaż pozostałe 9 komentarzy
Ja mam złe wspomnienia z szukania błędu w klasach szablonowych. Nie jestem w stanie się powstrzymać od przeklinania jak mi 10k linii błędów wylatuje :D - krwq 2015-02-19 20:38
Dojdą concepts i będzie ładniej w logach;p - satirev 2015-02-19 20:44
Nie śledzę już tych nowych standardoów po C++11 :P - krwq 2015-02-19 20:53
nie mam potrzeby, za rzadko używam C++. Jak ludzie na forum zaczną zadawać pytania to się pewnie nauczę. - krwq 2015-02-19 20:56

Pozostało 580 znaków

2015-02-19 23:57
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.

Pozostało 580 znaków

2015-02-20 09:13
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.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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