miloszes napisał(a)
Chcę tylko raz wczytać całą zawartość (np przez jeden proces). pÓźniej wszyskie procesy czytają z tych stringów.
Ale na początku muszę wczytać stringi z pliku do wektora. Chcę to robić w taki sposób ze względu na optymalizację swoich algorytmów. Cały mechanizm działa naprawdę fajnie tylko że taka struktura zajmuje mi w pamięci ok 1 MB. Teraz gdy tą bibliotekę otworzy 20 procesów (na szczęście wątki sobie współdzielą te obiekty). To wychodzi ok 20 MB na same dane :/ a nie mogę sobie na to pozwolić.
Przy szukaniu informacji na ten temat natknąłem sie na temat file mapping. Nie wgłębiałem się w ten temat, gdyż szukałem informacji na temat alokatorów. Sądzisz, że to mogłoby być rozwiązanie mojego problemu ??
Hmmm... Rozumiem z tego, że stringi nie są zmieniane (to po co std::string ??) i są tylko raz wczytane (to po co std::vector??), także w sumie daje to zwykłą tablicę stałych stringów (?), a problem jest przez dynamiczną alokację pamięci w DLL-u (string i vector)...
Tak szczerze mówiąc mogłeś pomyśleć nad tym przed napisaniem programu...
Najlepiej by było jakąs klasę własną walnąc jako interfejs dostępu do tych danych (stringów), wtedy nawet jak zmienisz implementację to nie zmieniasz reszty programu :)
Najprościej to umieścić wszystkie stringi w DLL (jeżeli nie muszą być zmieniane), wtedy odpada w ogóle alokacja, ręczne współdzielenie, itd.
W przypadku, gdy trzeba mieć stringi wczytywane z pliku to jednak może warto zastanowić się nad "shared_allocator" dla STL albo napisać własną obsługę, z tym że w obu przypadkach nie jest zadanie trywialne, a na dodatek zeleży od przyjętych założeń (np. czy w pliku będzie zawsze mniej niż lub równo N stringów -> wtedy można mieć stały obszar współdzielonej pamięci na tablicę stringów + oczywiście pamięć na stringi ale znowu, gdy ilość i wielkość może się zmieniać to dochodzi nam problem zarządzania pamięcią współdzieloną i do tego dynamicznie alokowaną, tym razem na poziomie systemu operacyjnego... właśnie dzięki file mapping).
Jak widać podejście zależy od tego co chcemy osiągnąć (wymagania, założenia).