Wpis z mikrobloga

#programowanie #java #cpp (taguje cpp bo więcej ludzi z cpp mogła się bawić takimi rzeczami i może mają coś ciekawego do powiedzenia)
A więc chcę wykorzystać w moim projekcie memory mapped files, i mam tu kilka pytań odnośnie używania ich w javie jak i ogólnie:
1. Czy można ręcznie określić gdzie plik zostanie załadowany, na jakim adresie w pamięci? Czy system na to pozwala? Czy da się to zrobić w javie? (Alokować pamięć itd umiem, tylko nie wiem jak zmapować do mojej pamięci wybrany plik)
2. I w związku z tym, czy można tak samo kontrolować wszystko mapując tylko część pliku?
3. Jakie są dobre biblioteczki od tego, które dadzą mi takie możliwości? Lub inne dobre, bez tych możliwości :<
4. Czy zadziała to tak jak powinno i jak mi aplikacja padnie, to dane i tak się zapiszą na dysk, czy muszą zapis wykonywać ręcznie? I czy mogę go wymusić?
5. Czy mogę jakoś kontrolować ilość pamięci którą poświeciłem na mapowanie plików? Chce określić limit pamięci w MiB której aplikacja nigdy nie przekroczy - bo może to się słabo skończyć. Wliczając w to pamięć która się marnuje, np leży między mapowanymi fragmentami bo wcześniej tam był inny mały fragment. (Problem znika jeśli mogę ręcznie wybrać obszar pamięci i nim ręcznie zarządzać)
I szukam albo artykułów o tym, albo może ktoś coś potrafi wyjaśnić.

I opis tego co robię, może ktoś bardziej zaawansowany coś doradzi:

  • 13
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@GotoFinal: no to fakt, rzeczywiście potrzebujesz sprytnego rozwiązania, na którym się nie znam, niestety. Niewielkim nakładem pracy można jeszcze zmontować ramdysk, ale na tym moje pomysły się kończą.
  • Odpowiedz
@GotoFinal: jestem na telefonie więc ciężko mi napisać więcej ( ͡° ʖ̯ ͡°)
sprawdź ByteBuffer i allocateDirect(), możesz powiedzieć mu ile bajtów ma alokować i po prostu czytać/czyścić aż wczytasz.
  • Odpowiedz
@lerner: Ale to dalej ma się nijak do mapowania plików, w API javy widze tylko prosta metodę map, która robi wszystko za ciebie, i nie daje żadnej kontroli nad tym co się tam dzieje. Czyli nie pozwala mi kontrolować gdzie to mapuje.
A mapowanie != wczytanie ot-tak do pamięci.
  • Odpowiedz
@leoha: Gotowych niestety nie widzę, ale dzięki za odpowiedz.
Znalazłem też już sporo innych danych, i tak właściwe to cały mój koncept tutaj jest zły :D Ale już zaczynam rozumieć jak to działa.
  • Odpowiedz
@GotoFinal: taki hint: to co napisales jest identyczne z tym jak dziala zarzadzanie pamiecia (page fault handler w systemach operacyjnych). Jak strony pamieci nie ma w ram to laduje ja ze swap. Strony oczywiscie maja staly rozmiar.

Zalokuj se jakis duzy obszar pamieci RAZ i tam kopiuj/mapuj brakujace 4k bloki z dysku, nadpisujac je, jesli trzeba.
  • Odpowiedz
@afe1: Niestety nie ma tak łatwo, nie da rady tak zrobić z poziomu javy, a i podobno robiąc z poziomu systemu nie ma pewności że wybrany adres zostanie użyty, i ogólnie z mapowaniem trzeba zaufać kernelowi.
Tyle się dowiedziałem z zaufanego źródła.
  • Odpowiedz
podobno robiąc z poziomu systemu nie ma pewności że wybrany adres zostanie użyty, i ogólnie z mapowaniem trzeba zaufać kernelowi.

Tyle się dowiedziałem z zaufanego źródła.


@GotoFinal: to źle się dowiedziałeś... z manuala mmap:

MAP_FIXED :Don't interpret addr as a hint: place the mapping at exactly that address. addr must be a multiple of the page size. (...)
  • Odpowiedz
@leoha: tak czy siak, nie ma nic pewnego dla każdego systemu tak by bez problemu dodać do javy, ale pytanie i tak niezbyt aktualne, bo i tak zrozumiałem że to nie ładuje ot tak całego pliku, tylko kernel sam wybiera co załadować, więc muszę mu zaufać :D
  • Odpowiedz