W mojej aplikacji używam słownika (wspierającego dodawanie, usuwanie, aktualizowanie i wyszukiwanie), w którym oba klucze i wartości są lub mogą być przekształcone do postaci szeregowej (wartości mogą być całkiem duże obiekty graficzne). Doszedłem do tego stopnia, że słownik stał się tak duży, że przytrzymanie go całkowicie w pamięci zaczęło czasami wyzwalać OutOfMemoryException
(czasami w metodach słownikowych, a czasem w innych częściach kodu).Słownik, który może zapisywać jego elementy rzadziej odwiedzane na dysku
Po próbie całkowitej zamiany słownika na bazę danych wydajność spadła do niedopuszczalnego poziomu.
Analiza wzorców użycia słownika wykazała, że zazwyczaj mniejsza część wartości jest "gorąca" (są dostępne dość często), a reszta (większa część) jest "zimna" (dostęp rzadko lub nigdy). Trudno powiedzieć, kiedy zostanie dodana nowa wartość, jeśli będzie ona gorąca lub zimna, ponadto niektóre wartości mogą migrować w tę iz powrotem pomiędzy gorącymi i zimnymi częściami w czasie.
Wydaje mi się, że potrzebuję implementacji słownika, który będzie w stanie przepłukać swoje zimne wartości na dysk w przypadku niskiej pamięci, a następnie ponownie załadować niektóre z nich na żądanie i przechowywać je w pamięci do następnego zdarzenia o niskiej pamięci występuje wtedy, gdy ich stan gorący/zimny zostanie ponownie oceniony. Najlepiej byłoby, gdyby implementacja precyzyjnie dostosowywała rozmiary jej gorących i zimnych części oraz czasu płukania w zależności od profilu użycia pamięci w aplikacji, aby zmaksymalizować ogólną wydajność. Ponieważ istnieje kilka wystąpień słownika w aplikacji (z różnymi typami klucz/wartość), myślę, że mogą potrzebować skoordynować swoje przepływy pracy.
Czy możesz zasugerować, jak zaimplementować taki słownik?
Czy myślisz o dodaniu pamięci podręcznej do podejścia db? Myślę, że standardowa pamięć podręczna z wygaszaniem może poprawić wydajność. – empi