POO Afficher 100 000 enreg rapidement
Débuté par TOURMEAU, 10 mar. 2025 14:13 - 9 réponses
Posté le 10 mars 2025 - 14:13
Bonjour, je cherche a afficher le plus rapidment possible 100 000 enregistrements dans une table d'une fenêtre. J'ai une classe avec MAPPING d'un fichier J'ai une requete intégrée à la classe j'ai une structure du fichier. j'ai une table sans liaison. (Je ne veux pas de lien entre la table et le fichier de données.) J'ai essayé plusieurs solutions, mais au mieux j'ai un temps de raffraichissement de 4s. voici le code de la méthode : // ------------------------------------------------------------------ sDataLigne est une chaîne = "" :m_sNomTable = sNomTable :m_sRubTri = sRubTri :m_sCondWhere1 = sCondWhere1 nJft est un entier = 0 // ------------------------------------------------------------------ :M_Fich_Tri() // Requete sur le fichier de données // ------------------------------------------------------------------ //ChronoDébut(2) //ConstruitTableFichier(Fen_Tests_MT_Clients.TABLE_T_Clients2,m_sdReqTri,taRemplirTable) //=> opération la plus rapide mais sature vite la mémoire //duDureeChrono2 = ChronoValeur(2) //Trace(duDureeChrono2..Seconde,DuréeVersChaîne(duDureeChrono2,duréeCentième)) //ChronoFin(2) ChronoDébut(1) POUR TOUT :m_sdReqTri // => Opération légèrement plus rapide 3.9s // stMonclient est un sttest1 // fichierversmemoire(stMonclient,:m_sdReqTri) // gtabStMesClients.Ajoute(stMonclient) // => Opération prenant 4s, mais sans aucun problème de mémoire nJft++ sDataLigne = "" POUR i = 1 _À_ :m_nNbEnregFich sDataLigne += {":m_sdReqTri." + :m_tab_ListRub[i] ,indRubrique} + TAB FIN TableAjoute({:m_sNomTable,indChamp},sDataLigne) SI nJft = 100 ALORS FenRepeint() // "Magouille" pour afficher rapidement les 100 premiers enr FIN duDureeChrono1 = ChronoValeur(1) Trace(duDureeChrono1..Seconde,DuréeVersChaîne(duDureeChrono1,duréeCentième)) ChronoFin(1) //Fen_Tests_MT_Clients.TABLE_TabStMesClients.Affiche() HLibèreRequête(m_sdReqTri) // ------------------------------------------------------------------ Affichageactif = faux puis vrai ne change rien Est-ce que quelqu'un a une idée arrêtée sur la façon d'optimiser ? Cdt. JT
Membre enregistré 859 messages
Posté le 10 mars 2025 - 14:42
Posté le 10 mars 2025 - 14:50
Bonjour Je vois votre problème, vous souhaitez afficher 100 000ligne en moins de temps, j'ai une solution pour vous 1. en premier lieu, votre code est déjà bon à ne pas utiliser une requête SQL, dans le cas d'une requête SQL saturé alors l'affichage est lente (plein de rubrique sature la relation je veux dire) 2. il ne faut pas coder une boucle dans une boucle, c'est le premier cas du lenteur, pour çà il faut affecter des conditions de résultat égale (utilisation de la condition IF je veux dire) Voilà une exemple de code pour vous aidez // EDD (03/25) : le parcours d'un fichier en version classe TableSupprimeTout({:m_sNomTable, indChamp}) POUR TOUT :m_sFichier IF (:m_sParamètre_A = {:m_sFichier + "." + Rubrique_A, indRubrique}) AND (:m_sParamètre_B = {:m_sFichier + "." + Rubrique_B, indRubrique}) AND (:m_sParamètre_C = {:m_sFichier + "." + Rubrique_B, indRubrique}) THEN TableAjouteLigne({:m_sNomTable, indChamp}, {:m_sFichier + "." + Resultat_A, indRubrique}, {:m_sFichier + "." + Resultat_B, indRubrique}) END FIN TableSelectMoins({:m_sNomTable, indChamp}) NB : attention il faut limiter le nombre de ligne dans le boucle de parcours du fichier NB : je suis sur que vous gagnez beaucoup de seconde sur ce code NB : ajouter un jauge pour motiver l'utilisateur (Jauge.borne min | Jauge.borne max | Jauge.valeur | une variable d'indice) c'est suffisant Cordialement Mr.RATSIMANDRESY Niry Aina Eddy
Membre enregistré 13 messages
Posté le 10 mars 2025 - 15:46
Salut TOURMEAU, quand tu fais un tableajouteligne(), tu donnes la main à l'IHM à chaque itération, donc c'est plus long. Ce qu'il faut faire: - Créer un tableau d'objet dynamique que tu remplis en Data binding de préférence, et connecter cette dernière avec la table champ (Table => Description => Contenu => remplissage variable) Tu verras, c'est carrément plus rapide, car l'affichage se fait en une seul fois avec un tableAffiche() nécessaire si tu n'exécute pas ton traitement à la déclaration de la fenêtre.
Posté le 17 mars 2025 - 09:36
Romuald a écrit : Salut TOURMEAU, quand tu fais un tableajouteligne(), tu donnes la main à l'IHM à chaque itération, donc c'est plus long. Ce qu'il faut faire: - Créer un tableau d'objet dynamique que tu remplis en Data binding de préférence, et connecter cette dernière avec la table champ (Table => Description => Contenu => remplissage variable) Tu verras, c'est carrément plus rapide, car l'affichage se fait en une seul fois avec un tableAffiche() nécessaire si tu n'exécute pas ton traitement à la déclaration de la fenêtre.
Posté le 17 mars 2025 - 09:50
Romuald a écrit : Salut TOURMEAU, quand tu fais un tableajouteligne(), tu donnes la main à l'IHM à chaque itération, donc c'est plus long. Ce qu'il faut faire: - Créer un tableau d'objet dynamique que tu remplis en Data binding de préférence, et connecter cette dernière avec la table champ (Table => Description => Contenu => remplissage variable) Tu verras, c'est carrément plus rapide, car l'affichage se fait en une seul fois avec un tableAffiche() nécessaire si tu n'exécute pas ton traitement à la déclaration de la fenêtre.
Bonjour Romuald, Merci pour ta réponse. J'hésitais entre plusieurs possibilités (tableAffiche, tableAjoute, une variable, les données d'une requete, ...) Comme tu as pu le voir je me lance dans la POO., et je ne suis pas encore au top. Je cherche a faire une classe "mappée" sur un fichier ou requete (100 000 enreg triés), avec le CRUD et l'affichage dans une table. Cette classe est générique et permet de prendre en compte les données d'un fichier *.fic dont le nom est déterminé par une variable de la classe. Ca fonctionne mais l'affichage était trop lent (100 000 enreg = 3") . Encore merci je vais poursuivre dans l'option que tu m'as donnée.
Posté le 17 mars 2025 - 09:50
Cédric_34 a écrit : Merci Cédric, je regarde.
Posté le 17 mars 2025 - 09:52
RATSIMANDRESY Niry Aina Eddy a écrit : Bonjour Je vois votre problème, vous souhaitez afficher 100 000ligne en moins de temps, j'ai une solution pour vous 1. en premier lieu, votre code est déjà bon à ne pas utiliser une requête SQL, dans le cas d'une requête SQL saturé alors l'affichage est lente (plein de rubrique sature la relation je veux dire) 2. il ne faut pas coder une boucle dans une boucle, c'est le premier cas du lenteur, pour çà il faut affecter des conditions de résultat égale (utilisation de la condition IF je veux dire) Voilà une exemple de code pour vous aidez // EDD (03/25) : le parcours d'un fichier en version classe TableSupprimeTout({:m_sNomTable, indChamp}) POUR TOUT :m_sFichier IF (:m_sParamètre_A = {:m_sFichier + "." + Rubrique_A, indRubrique}) AND (:m_sParamètre_B = {:m_sFichier + "." + Rubrique_B, indRubrique}) AND (:m_sParamètre_C = {:m_sFichier + "." + Rubrique_B, indRubrique}) THEN TableAjouteLigne({:m_sNomTable, indChamp}, {:m_sFichier + "." + Resultat_A, indRubrique}, {:m_sFichier + "." + Resultat_B, indRubrique}) END FIN TableSelectMoins({:m_sNomTable, indChamp}) NB : attention il faut limiter le nombre de ligne dans le boucle de parcours du fichier NB : je suis sur que vous gagnez beaucoup de seconde sur ce code NB : ajouter un jauge pour motiver l'utilisateur (Jauge.borne min | Jauge.borne max | Jauge.valeur | une variable d'indice) c'est suffisant Cordialement Mr.RATSIMANDRESY Niry Aina Eddy
Bonjour Mr.RATSIMANDRESY, Merci. Je vais tester votre code. Cordialement.
Membre enregistré 186 messages
Posté le 17 mars 2025 - 12:45
Bonjour à tous il n'y a pas de soucis, je vous en prie ... Cordialement Mr.RATSIMANDRESY Niry Ania Eddy
Posté le 25 mars 2025 - 12:10
JT a écrit : Romuald a écrit :
Salut JT, quand tu fais un tableajouteligne(), tu donnes la main à l'IHM à chaque itération, donc c'est plus long. Ce qu'il faut faire: - Créer un tableau d'objet dynamique que tu remplis en Data binding de préférence, et connecter cette dernière avec la table champ (Table => Description => Contenu => remplissage variable) Tu verras, c'est carrément plus rapide, car l'affichage se fait en une seul fois avec un tableAffiche() nécessaire si tu n'exécute pas ton traitement à la déclaration de la fenêtre.
Bonjour Romuald,
Merci pour ta réponse. J'hésitais entre plusieurs possibilités (tableAffiche, tableAjoute, une variable, les données d'une requete, ...)
Comme tu as pu le voir je me lance dans la POO., et je ne suis pas encore au top.
Je cherche a faire une classe "mappée" sur un fichier ou requete (100 000 enreg triés), avec le CRUD et l'affichage dans une table.
Cette classe est générique et permet de prendre en compte les données d'un fichier *.fic dont le nom est déterminé par une variable de la classe.
Ca fonctionne mais l'affichage était trop lent (100 000 enreg = 3") .
Encore merci je vais poursuivre dans l'option que tu m'as donnée.
Bonjour Romuald, J'ai gagné 1" de raffraichissement en passant par des objets, c'est deja bien, mais ce n'est pas satisfaisant. J'ai donc pris le parti de diviser en 2 l'acquisition des données. Je charge 10 000 objets dans mon tableau d'objets => tableaffiche() (environ 100 ms d'affichage, ça me va !) Puis je charge mes 90 000 autres objets dans mon tableau => tableaffiche() (environ 2", c'est beaucoup mais transparent) Un grand merci de m'avoir conforté sur cette piste. Cdt.