Niestety podczas pracy z dużymi zestawami danych serializacja i deserializacja struktury zawsze zajmie trochę czasu. DataTable
W szczególności są one dość złożonymi obiektami, ponieważ mają wiersze i kolumny, do których często dołączonych jest wiele metadanych - nawet jeśli wygląda na to, że jest to podstawowa tabela.
DataTable
vs List<POCO>
:
Zastanów się, czy naprawdę musisz serializować jako DataTable
. Czy możesz stworzyć prostszy POCO i zserializować List<YourRecord>
? Innymi słowy, jeśli nie potrzebujesz dodatkowych atrybutów w polach i kolumnach i możesz serializować do prostszego formatu, prawdopodobnie będzie to szybsze i bardziej wydajne w pamięci podręcznej; a następnie przywróć do DataTable
jeśli to konieczne.
Inną opcją jest podzielenie DataTable
na mniejsze zestawy, które można serializować i przechowywać w mniejszych częściach. Może się okazać, że jest to bardziej wydajne. Powinieneś być w stanie to porównać.
Wzorzec:
Ostatecznie pamięć podręczna Redis powinna być poprawą czasu potrzebnego na ponowne wysłanie zapytania do źródła danych. Używasz terminu takes too much time
, ale jeśli wydobycie z pamięci podręcznej zajmuje 2 sekundy w porównaniu z 8 sekundami na zapytanie o źródło danych, to jest to znaczny wzrost. Ale jedynym sposobem, aby mieć pewność, jest porównanie.
-
Skonfiguruj swoje środowisko tak, aby korzystać tylko z niezbędnych narzędzi. Nie wykonuj innych zadań podczas przeprowadzania testów porównawczych, aby nie wprowadzać żadnych uprzedzeń.
-
Zapisz czas potrzebny do serializacji
DataTable
. Wykonaj tę czynność wiele razy i średnio.var start = DateTime.Now; // Serialize var duration = DateTime.Now - start;
-
Eksperymentuj z różnymi rozmiarami tabeli
DataTable
s i sprawdź, czy znajdziesz odpowiedni czas. -
Wypróbuj inną bibliotekę serializacji, taką jak JSON.NET. Chociaż fajnie jest zachować cały ServiceStack, może to pomóc w ustaleniu, czy jest to wada ServiceStack.Text, czy tylko problem z dużym zbiorem danych.
-
Powtórz proces deserializacji.
Pamięć:
Jeśli pracujesz z dużymi zestawami danych, czy zarówno Twoja aplikacja, jak i pamięć podręczna mają wystarczającą ilość pamięci? Pamięć w Twojej aplikacji może być wąskim gardłem; Podczas wykonywania operacji należy obserwować monitor aktywności systemu i upewnić się, że nie zabraknie pamięci i czy system wykonuje stronicowanie. Jeśli zauważysz, że tak się dzieje, rozważ zwiększenie pamięci RAM lub podziel DataTable na mniejsze zestawy danych, jak wspomniano wcześniej.
Opóźnienie:
Jeśli łączysz się z serwerem Redis przez sieć, a nie na tym samym komputerze, czy sprawdziłeś opóźnienie sieci? Możesz chcieć wysłać ping między serwerem aplikacji a serwerem pamięci podręcznej i upewnić się, że rzeczywiście masz niski ping. Szczególnie jeśli zauważysz, że buforowanie prostych obiektów jest powolne.
Ponownie?
Jeśli uważasz, że nie ma sposobu, aby skrócić czas buforowania i przywracania, być może użycie Redis nie jest dobrym rozwiązaniem. Być może przy użyciu static DataTable
w pamięci aplikacji byłoby bardziej odpowiednie. Innymi słowy, przechowuj pamięć podręczną w pamięci aplikacji, a następnie nie musisz się martwić o serializację i deserializację. Oczywiście możesz być ostrożny, aby upewnić się, że masz wystarczająco dużo pamięci dla swojej aplikacji, aby to zrobić. Byłbym jednak zaskoczony, gdybyś musiał wybrać tę opcję .
Podsumowanie:
Bez wglądu w swój zbiór danych lub wiedzę na temat usługi, którą tworzysz, jest to ostatecznie tylko ogólna porada, jak najlepiej zawęzić przyczynę problemu. Najważniejsza rada to nie używać DataTable
jeśli wystarczy prostsza struktura, i porównaj każdą z operacji w celu określenia wąskich gardeł.
Mam nadzieję, że to pomoże.