Når man arbejder med store datasæt, vil det desværre altid tage tid at serialisere og deserialisere strukturen. Datatabel
Især s er ret komplekse objekter, da de har rækker og kolonner, som ofte har en masse metadata knyttet til sig - selv når det ser ud til at være en grundlæggende tabel.
Datatabel
vs Liste :
Overvej, om du virkelig skal serialisere som en Datatabel
. Kunne du oprette en enklere POCO og serialisere en List
? Med andre ord, hvis du ikke har brug for ekstra attributter på felter og kolonner, og du kan serialisere til et enklere format, er det sandsynligvis hurtigere og mere pladseffektivt i cachen; og gendan derefter til en Datatabel
hvis det er nødvendigt.
En anden mulighed er at opdele DataTable
i mindre sæt, som du serialiserer og opbevarer i mindre dele. Du kan finde denne mere effektiv. Du burde være i stand til at benchmarke dette.
Benchmark:
I sidste ende skulle din Redis-cache være en forbedring i forhold til den tid, det tager at genforespørge datakilden. Du bruger udtrykket tager for meget tid
, men hvis det tager 2 sekunder at komme fra cachen mod 8 sekunder at forespørge datakilden, så er det et betydeligt løft. Men den eneste måde at være sikker på er at benchmarke.
-
Konfigurer dit miljø, så du kun kører nødvendige værktøjer. Udfør ikke andre opgaver, mens du kører benchmarks, så du ikke introducerer nogen bias.
-
Registrer den tid, det tager at serialisere en
Datatabel
. Udfør denne handling mange gange og gennemsnitligt.var start = DateTime.Now; // Serialize var duration = DateTime.Now - start;
-
Eksperimenter med forskellige størrelser af
Datatabel
s og se om du finder et acceptabelt tidspunkt. -
Prøv et andet serialiseringsbibliotek, såsom JSON.NET. Selvom det er rart at beholde det hele ServiceStack, kan dette hjælpe dig med at afgøre, om det er en mangel ved ServiceStack.Text eller bare et problem med det store datasæt.
-
Gentag processen for deserialisering.
Hukommelse:
Hvis du arbejder med store datasæt, har både din applikation og cachen tilstrækkelig hukommelse? Hukommelsen i din ansøgning kan være en flaskehals; Du bør holde øje med dit systems aktivitetsmonitor, mens du udfører handlingerne, og sikre dig, at du ikke løber tør for hukommelse og får dit system til at udføre personsøgning. Hvis du opdager, at dette sker, kan du enten overveje at øge RAM'en eller dele datatabellen op i mindre datasæt som nævnt før.
Latens:
Hvis du opretter forbindelse til en Redis-server over et netværk og ikke på samme maskine, har du så tjekket netværkets latens? Du ønsker måske at pinge mellem din applikationsserver og cacheserveren og sikre dig, at du rent faktisk har et lavt ping. Især hvis du opdager, at caching af simple objekter er langsom.
Redis?
Hvis du opdager, at der ikke er nogen måde at forbedre tiden til at cache og gendanne, så er det måske ikke en god idé at bruge Redis. Måske ved at bruge en statisk datatabel
i applikationshukommelsen ville være mere egnet. Med andre ord, ved at holde cachen i applikationshukommelsen, og så er der ingen serialisering og deserialisering at bekymre sig om. Selvfølgelig skal du muligvis være forsigtig med at sikre, at du har nok hukommelse til din applikation til at gøre dette. Jeg ville dog blive overrasket, hvis du skulle vælge denne mulighed .
Oversigt:
Uden at se dit datasæt eller kendskab til den service, du bygger, er det i sidste ende kun generiske råd om, hvordan du bedst indsnævrer årsagen til dit problem. Det vigtigste råd er, at du ikke skal bruge en Datatabel
hvis en enklere struktur vil gøre det, og benchmark hver af operationerne for at bestemme eventuelle flaskehalse.
Jeg håber, at dette hjælper.