Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Rekomendowane odpowiedzi

Opublikowano
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:


Mam od 200MiB do ~5GiB (i może być więcej, ale to taki typowy przedział) plików w rozmiarach od 100KiB do 8MiB (teoretycznie mogą być większe, ale mało prawdopodobne).

Każdy z tych plików jest ładnie podzielony na 4KiB sektory, w pierwszym są indexy, potem sektory z danymi - z tym że kilka sektorów może być od jednego indexu, czyli muszą być one zawsze ładowane razem.

Kiedy potrzebuje pewnych danych chce zmapować sektor z indexami - idealnie 4KiB, i potem zmapować potrzebne mi sektory - każdy po 4 KiB, ale może być kilka ze sobą powiązanych - więc muszę ja zmapować obok siebie dla sensownego odczytu/zapisu.

Po pewnym czasie może się okazać że dany plik jest już bezużyteczny, i muszę się go pozbyć, czyli zapisać i odmapować.

No i tutaj pojawia się problem z mapowanymi plikami: jak na razie czytam o takich libkach w javie, to wszystkie wybierają sobie adres sam, a kiedy ja tak będę sobie alokować i usuwać losowe fragmenty, tutaj 1MiB, tutaj 16KiB itd, i boję się że po pewnym czasie powstanie masa małych przerw po 4-8KiB w których już większość nowych plików się nie zmieści...

Dlatego chciałbym mapować wszystko ręcznie, alokując z góry pewną ustaloną ilość pamięci, a na niej mapować pliki wedle własnego uznania - i w razie kłopotów... działać jak GC, czyli zapisać i przesunąć.


 

 

PS: żyje ktoś w tym dziale?

1438614356923701010629.png

 

Opublikowano
Proszę, nie udzielaj się, bo nic nie pomagasz tylko przeklejasz to co znam na pamięć...

 

A temat można zamknąć, już wszystko wiem

1438614356923701010629.png

 

Opublikowano

Ogólnie nie ma możliwości dowiedzieć się co jest pod jakim adresem, niezależnie od języka. Każdy proces ma swoją własną  wirtualną przestrzeń adresową, która dla niego jest ciągła a tak naprawdę może być porozrzuca w pamięci fizycznej.

RAsfepN.png

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...