Malheureusement, lorsque vous travaillez avec de grands ensembles de données, il faudra toujours du temps pour sérialiser et désérialiser la structure. DataTable
Les s en particulier sont des objets assez complexes, car ils comportent des lignes et des colonnes auxquelles sont souvent associées de nombreuses métadonnées, même lorsqu'il semble s'agir d'un tableau de base.
DataTable
vs List<POCO>
:
Déterminez si vous avez vraiment besoin de sérialiser en tant que DataTable
. Pourriez-vous créer un POCO plus simple et sérialiser un List<YourRecord>
? En d'autres termes, si vous n'avez pas besoin d'attributs supplémentaires sur les champs et les colonnes et que vous pouvez sérialiser dans un format plus simple, c'est probablement plus rapide et plus économe en espace dans le cache; puis restaurer dans un DataTable
si nécessaire.
Une autre option consiste à diviser le DataTable
en plus petits ensembles, que vous sérialisez et stockez en plus petites parties. Vous pouvez trouver cela plus performant. Vous devriez pouvoir comparer cela.
Référence :
En fin de compte, votre cache Redis devrait être une amélioration par rapport au temps nécessaire pour réinterroger la source de données. Vous utilisez le terme takes too much time
, mais s'il faut 2 secondes pour sortir du cache contre 8 secondes pour interroger la source de données, c'est un coup de pouce significatif. Mais la seule façon d'être sûr est de comparer.
-
Configurez votre environnement de manière à n'exécuter que les outils nécessaires. N'effectuez pas d'autres tâches pendant l'exécution des benchmarks, afin de ne pas introduire de biais.
-
Enregistrer le temps nécessaire pour sérialiser un
DataTable
. Effectuez cette action plusieurs fois et en moyenne.var start = DateTime.Now; // Serialize var duration = DateTime.Now - start;
-
Expérimentez avec différentes tailles de
DataTable
s et voyez si vous trouvez un temps acceptable. -
Essayez une autre bibliothèque de sérialisation, telle que JSON.NET. Bien qu'il soit agréable de conserver tout ServiceStack, cela peut vous aider à déterminer s'il s'agit d'une lacune de ServiceStack.Text ou simplement d'un problème avec le grand ensemble de données.
-
Répétez le processus de désérialisation.
Mémoire :
Si vous travaillez avec de grands ensembles de données, votre application et le cache disposent-ils de suffisamment de mémoire ? La mémoire de votre application peut être un goulot d'étranglement; Vous devez surveiller le moniteur d'activité de votre système lors de l'exécution des opérations et vous assurer que vous ne manquez pas de mémoire et que votre système effectue une pagination. Si vous constatez que cela se produit, envisagez d'augmenter la RAM ou de diviser le DataTable en ensembles de données plus petits, comme mentionné précédemment.
Latence :
Si vous vous connectez à un serveur Redis via un réseau et non sur la même machine, avez-vous vérifié la latence du réseau ? Vous voudrez peut-être envoyer un ping entre votre serveur d'applications et le serveur de cache et vous assurer que vous avez réellement un ping faible. Surtout si vous trouvez que la mise en cache d'objets simples est lente.
Redis ?
Si vous trouvez qu'il n'y a aucun moyen d'améliorer le temps de mise en cache et de restauration, alors peut-être que l'utilisation de Redis n'est pas une bonne solution. Peut-être en utilisant un static DataTable
dans la mémoire de l'application serait plus approprié. En d'autres termes, en conservant le cache dans la mémoire de l'application, vous n'aurez plus à vous soucier de la sérialisation et de la désérialisation. Bien sûr, vous devrez peut-être faire attention à ce que vous ayez suffisamment de mémoire disponible pour votre application pour ce faire. Je serais toutefois surpris si vous deviez choisir cette option .
Résumé :
Sans voir votre ensemble de données ou la connaissance du service que vous créez, il ne s'agit finalement que de conseils génériques sur la meilleure façon de réduire la cause de votre problème. Le conseil clé est de ne pas utiliser de DataTable
si une structure plus simple suffit, et comparez chacune des opérations pour déterminer les éventuels goulots d'étranglement.
J'espère que cela vous aidera.