J'ai besoin d'un avis architectural et d'approches pour le problème suivant :
INTRO :
Nous disposons d'un tableau de
~4M
rangées appeléesPurchases
.
W de~5k
rangées appeléesCategories
.
En outre, nous disposons d'un~4k
SubCategories
.Nous utilisons T-SQL pour stocker les données.
A ( pendant l'exécution ), le serveur reçoit une requête d'environ 10-15 N possibilités de paramètres. Sur la base des paramètres, nous prenons les achats, les trions par catégories et sous-catégories et effectuons quelques calcul.
Le processus de "calcul" comprend notamment le filtrage, trier, réorganiser les champs d'achats, soustraire les achats les uns des autres, ajouter d'autres achats à la liste. les uns avec les autres, ajouter d'autres achats les uns avec les autres, trouver des économies, etc...
Ce processus est spécifique à l'utilisateur, c'est pourquoi chaque utilisateur obtiendra des données différentes, en fonction de leur rôle.
Problème :
Ce processus prend environ 3 à 5 minutes et nous voulons le réduire. réduire.
Auparavant, ce processus s'effectuait en mémoire, sur le navigateur, par l'intermédiaire du logiciel webworkers (JS). Nous nous en sommes éloignés car la mémoire commençait à devenir la mémoire commençait à devenir très importante et que la plupart des navigateurs commençaient à échouer lors du chargement. Nous avons alors déplacé le service au serveur (NodeJS), qui a traité la demande à la volée, via des processus enfants. Raison d'être des processus enfants : le processus de calcul passe par une boucle "for" à propos de 5,000x fois (pour chaque catégorie) le "calcul" mentionné ci-dessus.
V distribuer le travail en #of child processes, ce qui nous a donné de meilleurs résultats. de meilleurs résultats, si nous utilisions au moins 16 cœurs ( 16 processus enfants ).
Le temps de traitement actuel est en baisse à environ 1,5-2 minutes, b mais nous voulons voir si nous avons de meilleures options.
Je comprends qu'il est difficile de comprendre pleinement nos objectifs sans voir de code, mais je pose la question de manière spécifique. Quels sont les moyens de faire du calcul sur des données semi-big au moment de l'exécution ?
Quelques réflexions que nous avons eues :
-
utiliser des tables SQL en mémoire et effectuer des calculs en SQL
-
utilisation des services azure batch
-
en utilisant des machines plus grandes ( ~ 32-64 cœurs, c'est peut-être notre meilleure chance si nous n'avons pas d'autres idées. Mais bien sûr, le coût augmente drastiquement, mais nous acceptons le fait que le coût augmentera).
-
entrer dans l'écosystème hadoop (ou d'autres écosystèmes big data)
d'autres faits utiles :
- nos achats portent sur ~1GB (devenant un peu trop volumineux pour l'informatique en mémoire)
- Nous pensons faire du pré-calcul et de la mise en cache sur redis pour avoir QUELQUES données prêtes pour le client ( nous allons utiliser leurs paramètres définis dans leur compte pour pré-calculer chaque jour, or les clients ont tendance à changer ces paramètres fréquemment, donc nous devons avoir un moyen efficace de traiter les données qui ne sont PAS mises en cache et pré-calculées ).
Si vous avez besoin de plus d'informations pour mieux comprendre notre dilemme, n'hésitez pas à commenter et je vous fournirai autant d'informations que possible. Il y aurait trop de code à coller ici pour que l'on comprenne bien les algorithmes, c'est pourquoi je veux essayer de présenter notre problème avec des mots, si possible.