Współdzielenie pamięci (do zapisu) przez procesy ort!

0

Witam.

Mam następujące pytanie.
Czy współdzielił ktoś pamięć do zapisu (do odczytu jest wspołdzielona automatycznie do momentu az jakis proces nie bedzie usiłował czegoś zmienić) dla obiektów typu stl string.
Udało mi się współdzielić pamięć dla typów prostych czyli int, bool itp. za pomocą dyrektyw preprocesora. Niestety wygląda na to, że ten sposób nie działa dla obiektów bardziej złożonych (np vector stringów).

pozdrawiam,
MiloszeS

0

Eee, a o co chodzi...?
Możesz podać kod tego "współdzielenia pamięci za pomocą dyrektyw preprocesora" ??
Kompilator, OS ??

0

[windows/wszsystkie platformy (poza przenośnymi)]
kompilator visual C++ 6.0

mam biblioteke dll.

w środku jako zmienną globalną mam zadeklarowany std::vector std::string. Jak zrobić żeby ten pojemnik wraz ze stringami był współdzielony przez wszystkie procesy które załadują tą bibliotekę.

Wczoraj doszedłem do tego, że trzeba jako argument przy definicji dodać alokator, który potrafi alokować pamięć współdzieloną. czyli coś w tym stylu:

std::vector <std::string <shared_allocator>, shared_allocator>

zastanawiam się teraz, czy STL dostarcza alokaotry potrafiace alokować pamięć współdzieloną, czy muszę sobie sam taki napisać.

Jeśli chodzi o typy proste to jest dosyć łatwa sprawa. Z obiektami jest trochę więcej problemów. Może ktoś zna inny sposób, lub może podać mi namiaryu na gotowy już alokator pamięci współdzielonej.

0
miloszes napisał(a)

zastanawiam się teraz, czy STL dostarcza alokaotry potrafiace alokować pamięć współdzieloną, czy muszę sobie sam taki napisać.

Standardowo - NIE ma takiego alokatora

0

A że się tak zapytam jeszcze: po co Ci współdzielenie wektora stringów w DLL?? Będziesz zmieniał wektor (zawartość)? Będziesz zmieniał stringi??
Pamięć w pliku jest statyczna, dynamicznych obiektów bez specjalnej obsługi to się nie da dzielić... Być może potrzebujesz innego mechanizmu IPC (niższego?), np. file mapping pod Windows?

0

Chcę tylko raz wczytać całą zawartość (np przez jeden proces). <ort>pÓźniej </ort>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 ??

0
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).

0

Nie moge wrzucic stringow do dllki. Za duzo tego jest. Ponadto zawartosc pliku czesto jest edytowana więc potrzebuje to jakoś zautomatyzować.
Starałem, się przemyśleć całą sprawe przed rozpoczęciem, więc ewentualna zmiana wchodzi w rachube. Jednakże wolałbym pozostać przy wektorach stringów. Szczerze powiedziawszy mam ich ok 30 ;). W taki sposób poradziłem sobie z szybkim dostępem do słów (indeksowanie).

Na szczęście po załadowaniu stringów już nic się nie zmienia. Czyli nie potrzebuje realokacji pamięci, ani zmiany jej obszaru. Moge tez najpierw mniej wiecej stwierdzic ile będzie potrzeba pamięci.
Chyab ściągne najnowszą wersję STL i poprubuje ze shared_allocator.

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