Je cherche des conseils, les meilleures pratiques, etc...
Technologie : C# .NET4.0, Winforms, 32 bits
Je cherche à obtenir des conseils sur la meilleure façon d'aborder le traitement des données volumineuses dans mon application C# Winforms, qui fait l'objet d'une utilisation élevée de la mémoire (ensemble de travail) et d'exceptions occasionnelles de type OutOfMemory.
Le problème est que nous effectuons une grande quantité de traitement de données "en mémoire" lorsqu'un "panier d'achat" est ouvert. Pour simplifier, lorsqu'un "panier" est chargé, nous effectuons les calculs suivants ;
-
Pour chaque article du "panier", vous récupérez l'historique de son prix en remontant jusqu'à la date à laquelle l'article est apparu en stock pour la première fois (il peut s'agir de deux mois, deux ans ou deux décennies de données). Les données historiques de prix sont récupérées à partir de fichiers texte, sur Internet, dans n'importe quel format supporté par un plugin de prix.
-
Pour chaque article, pour chaque jour depuis qu'il est apparu en stock, nous calculons diverses mesures qui permettent d'établir un profil historique pour chaque article du panier d'achat.
Le résultat est que nous pouvons potentiellement effectuer des centaines, des milliers et/ou des millions de calculs en fonction du nombre d'articles dans le "panier". Si le panier contient trop d'articles, nous courons le risque de rencontrer une exception "OutOfMemory".
Quelques mises en garde ;
-
Ces données doivent être calculées pour chaque article du "panier" et sont conservées jusqu'à ce que le "panier" soit fermé.
-
Même si nous exécutons les étapes 1 et 2 en arrière-plan, la vitesse est importante car le nombre d'articles dans le "panier" peut affecter considérablement la vitesse de calcul globale.
-
La mémoire est récupérée par le ramasseur de déchets .NET lorsqu'un "panier" est fermé. Nous avons profilé notre application et nous nous assurons que toutes les références sont correctement éliminées et fermées lorsqu'un panier est fermé.
-
Une fois tous les calculs terminés, les données résultantes sont stockées dans un IDictionnaire. " CalculatedData " est un objet de classe dont les propriétés sont des métriques individuelles calculées par le processus ci-dessus.
Quelques idées auxquelles j'ai pensé ;
Il est évident que ma principale préoccupation est de réduire la quantité de mémoire utilisée par les calculs, mais le volume de mémoire utilisé ne peut être réduit que si
1) réduire le nombre d'indicateurs calculés pour chaque jour ou
2) réduire le nombre de jours utilisés pour le calcul.
Ces deux options ne sont pas viables si nous souhaitons répondre à nos besoins commerciaux.
-
Fichiers mappés en mémoire
Une idée a été d'utiliser des fichiers mappés en mémoire qui stockeront le dictionnaire de données. Cela serait-il possible/faisable et comment pouvons-nous mettre cela en place ? -
Utiliser une base de données temporaire
L'idée est d'utiliser une base de données séparée (pas en mémoire) qui peut être créée pour le cycle de vie de l'application. Au fur et à mesure que les "paniers" sont ouverts, nous pouvons faire persister les données calculées dans la base de données pour une utilisation répétée, ce qui évite d'avoir à recalculer pour le même "panier".
Existe-t-il d'autres solutions que nous devrions envisager ? Quelle est la meilleure pratique lorsqu'il s'agit d'effectuer des calculs sur des données volumineuses et de les réaliser en dehors de la RAM ?
Tout conseil est apprécié....