Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gérer des masses de données sur Django

    21 août 2023 à 9:35:15

    Bonjour,

    Je développe actuellement un projet sur Django, qui permet de lancer une analyse à partir d'un script en backend et qui affiche affiche les résultats sur un tableau de bord avec tableaux, camemberts, diagramme en barre, etc.

    Le code étant très long, je ne vais pas le poster ici et je vais donc expliquer en gros le fonctionnement.

    Dans mon views.py, j'envoie à mon template qui affiche les données une variable contenant un dictionnaire. Ainsi, dans mon template, j'itère sur ce dictionnaire et j'affiche des onglets en fonction des clés, puis les données ...

    Lorsque je fais le test avec un jeu de données assez court, cela fonctionne parfaitement. Tous les graphiques sont affichés correctement, les tableaux, etc.

    Cependant, si je lance avec les données de base, qui sont assez conséquentes, le temps de chargement est très long, et fait même parfois planter Django.

    Je suis débutant sur cet outil et également sur le frontend. Je me suis donc dit que, le problème venait peut-être du fait que j'envoie au template une variable qui contient toutes les données, en même temps. J'ai vu que l'on pouvait utiliser des requêtes AJAX pour aller chercher les données en fonction des onglets cliqués, mais je ne sais pas si c'est la bonne solution.

    Mon projet ressemble beaucoup à celui-ci : https://github.com/yogeshojha/rengine. Mais je n'arrive pas à identifier comment fait-il pour gérer si bien ses données.

    Je mets tout de même un exemple de code dans mon template :

                <div class="tab-pane fade" id="visualization">
                    <ul class="nav nav-tabs" id="domainTabsVisual">
                        {% for domain in dict_results %}
                            <li class="nav-item">
                                <a id="nav-{{ domain }}" class="nav-link {% if forloop.first %}active{% endif %}" data-bs-toggle="tab" href="#{{ domain }}">{{ domain }}</a>
                            </li>
                        {% endfor %}
                    </ul>
                    <div class="tab-content">
                        {% for domain, entries in dict_results.items %}
                            <div class="domain-tab tab-pane fade {% if forloop.first %}show active{% endif %}" id="{{ domain }}">
                                <div id="dashboard" class="row">
                                   <div class="grid-stack-item-content mb-3">
                                       <h2>CVE les plus communes</h2>
                                       <div id="cveChart-{{ domain }}"></div>
                                   </div>                                                                 
                                </div>
                            </div>
                        {% endfor %}
                    </div>
                </div> 

    Je fais également beaucoup de traitement Javascript. Par exemple, j'affiche autant d'onglets que de domaines présents, et dans ces onglets, j'affiche des données qui listent ligne par ligne les données, avec les colonnes qui correspondent aux clés associées. Ensuite, j'ai une "sidebar" qui me permet de choisir les colonnes que je souhaite ajouter ou supprimée. Si je supprime une valeur, les colonnes sont supprimées sont tous les tableaux de tous les onglets.

    Si cela est difficile à visualiser je pourrais vous envoyer d'autres parties de code ...

    Merci d'avance pour votre aide

    • Partager sur Facebook
    • Partager sur Twitter
      21 août 2023 à 10:43:37

      CyprienHanercos a écrit:

      Je suis débutant sur cet outil et également sur le frontend.

      Il faut avoir une idée du travail à réaliser (et du temps qui va avec...) dans les différentes couches (frontend, backend,...) pour produire les données à afficher. Puis il y a la dimension quantité de données à échanger via le réseau et le nombre de requêtes qu'il va falloir traiter.

      Vous imaginez bien que chaque composant utilisé (le client, le réseau, le serveur, la base de données, la vitesse des disques, la puissance CPU,...) a ses limites: la réactivité de l'ensemble dépendra de goulots d'étranglements à identifier et améliorer.

      C'est toute une conception à faire... et des solutions à mettre en place. Si un tel dimensionnement n'a pas été pris en compte, pas étonnant qu'il y ait des soucis à la montée en charge. Et il est peut probable qu'on puisse s'en sortir avec un réglage fin de quoi que ce soit.

      • Partager sur Facebook
      • Partager sur Twitter
        22 août 2023 à 7:41:47

        Bonjour et merci pour votre réponse. Je me suis lancé dans ce projet pour découvrir Django, mais il est vrai que je n'ai pas tanr réfléchi à l'architecture générale.

        En backend, j'ai plusieurs scripts python/C qui s'exécutent sans problèmes. De ce côté, j'ai essayé d'optimiser au maximum. 

        Ensuite, comme je l'ai dit, je récupère toutes les données dans une variable dans ma vue dans views.py, et tout cela est fournis au template en "contexte".

        Pour l'instant, j'ai donc utilisé le minimum pour faire fonctionner le projet Django. À savoir qu'il communique également avec une base de données MySQL.

        Qu'auriez-vous conseiller d'utiliser comme méthode pour pouvoir bien situer la conception à réaliser en fonction des données utilisées ?

        Je suis encore au début de mon projet donc je peux tout refaire s'il le faut, mais j'ai du mal à voir comment je peux étudier l'architecture qui conviendrait.

        Pour moi, le problème actuel, c'est au niveau du Javascript, qui fait parfois planter le navigateur. J'ai dû faire trop de fonctions dans tous les sens et donc il n'y arrive plus quand j'ajoute toutes les données.

        • Partager sur Facebook
        • Partager sur Twitter
          22 août 2023 à 9:42:27

          CyprienHanercos a écrit:

          Ensuite, comme je l'ai dit, je récupère toutes les données dans une variable dans ma vue dans views.py, et tout cela est fournis au template en "contexte".

           Ca ne dit rien quand au temps qu'il faut au serveur pour retourner ces données...

          CyprienHanercos a écrit:

          Pour moi, le problème actuel, c'est au niveau du Javascript, qui fait parfois planter le navigateur. J'ai dû faire trop de fonctions dans tous les sens et donc il n'y arrive plus quand j'ajoute toutes les données.

          S'il faut "calculer" avant de pouvoir les afficher et que le temps de calcul dépend de la taille des données, peut être qu'il faut marcher un peu le travail côté serveur et/ou revoir certaines fonctions javascript.

          CyprienHanercos a écrit:

          Qu'auriez-vous conseiller d'utiliser comme méthode pour pouvoir bien situer la conception à réaliser en fonction des données utilisées ?

          La conception initiale devrait faire une estimation des temps de réponses en fonction de la quantité de données et des traitements à faire. Et quand on ne sait pas estimer, on fait un prototype qui permettra de mesurer les différentes parties des traitements (au moins les principaux) et on regarde comment ça bouge avec une montée en charge. Ce qu'on peut faire dépendra de ce qu'on trouve et des possibilités qu'on aura d'appliquer une médecine.

          • Partager sur Facebook
          • Partager sur Twitter

          Gérer des masses de données sur Django

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown