IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

TachesParallèles plante le programme


Sujet :

WinDev

  1. #1
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut TachesParallèles plante le programme
    Bonjour,

    Pour l'un de mes programmes j'ai besoin d'importer une importante liste de données. Pour cela j'ai donc fait une boucle en programmation qui m'effectue des HAjoute().
    Comme on peux tous s'en douter, le temps d'importation est très très (très) long...

    J'ai donc pensé au système de tache parallèle. Chaque tache effectue un hAjoute().

    Cependant quand je lance le programme. Un plantage apparait avec un message d'erreur indiquant qu'il n'y a plus d'espace pour gérer la fonction hAjoute()...

    Avez-vous connaissance de ce problème ? Connaissez-vous une technique pour un import massif de données ?

    (J'ai essayé HAjoute, Hecrit+HReindexe, requete sql : rien n'accélère le temps de traitement...).
    (Il s'agit d'une base HFSQL C/S)

    Merci d'avance
    Google est ton ami !

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Tu ne le dis pas, mais en lisant entre les lignes, on devine que tu lances en parallèle 1000 ou 50000 taches (une pour chaque enregistrement).
    En caricatural, c'est comme si tu lançais 1000 ou 50000 sessions de ton programme. D'ailleurs dans le gestionnaire des taches, dans l'un des onglets, j'imagine qu'on voit autant de lignes qu'il y a de taches parallèles actives.
    Donc tu plantes ton ordi.
    Il faut que tu te débrouilles pour lancer un nombre raisonnable de sessions en parallèle. Je ne connais pas le plafond, une vingtaine ?

    PS : Quand tu as beaucoup de hajoute à faire(), et que tu es sur que tes données sont propres, ( pas de doublons, pas de ligne invalide ... ), et que tu fais ça à froid (pas d'utilisateur en train de consulter la base pendant l'import ... ... ) il faut passer par des hEcrit() puis un hRéindexe() ensuite.

    Même sans utilisation de tâcheParallèle(), ça suffit pour diviser les temps de traitement par 5 ou 10.

    PS n°2 : je suis moyennement confiant sur l'utilisation des taches parallèles pour accélérer les écritures sur disque. Je n'ai pas relu la doc, mais intuitivement, je me dis que les tâches parallèles ne serviront à rien dans ton cas, sauf si tu as une configuration très particulière. ( configuration type cloud / HADOOP, où les données seraient réparties sur plusieurs serveurs )

    OS n°3 : je vois que tu as testé hEcrit() + hRéindexe() ... ça ne suffit pas ?
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Membre éclairé
    Homme Profil pro
    Chef de projet
    Inscrit en
    Mars 2017
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2017
    Messages : 327
    Points : 788
    Points
    788
    Par défaut
    A mon avis les taches parallèles pour les imports de données ne servent pas à grand chose car....tu n'as qu'un seul disque. Oui tu pourras dispatcher tes taches sur plusieurs coeurs de processeurs (inutile que le nombre de tâches dépasse le nombre de coeurs logiques du processeur à mon avis...au delà ça ne sert plus à rien), mais toutes tes tâches ne bossent au final qu'avec un seul disque. Sauf si comme dit plus haut tu as un cluster ayant une grosse capacité en lecture écriture et même là, pas sur que le dispatch soit utile car je ne crois pas que la moulinette soit lente pour un souci de puissance de calcul ^^

    Quand j'ai à faire des imports ou migration de données je le fais en local sur mon poste (donc toi fais le sur le serveur si possible car en C/S les temps de transfert en réseau sont peut être plus impactants), en Classic le plus souvent et sur un SSD, et j'optimise l'algo. Après si c'est long...bah c'est long!

  4. #4
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Bonjour,

    Effectivement cela n'est peut-être pas utile de passer par des taches parallèles pour écrire sur un disque dur...

    Quand j'ai comparé le HAjoute() avec le HEcrit()+HReindexe() je me suis retrouvé avec le résultat suivant :
    HEcrit+HReindexe : 380sec
    HAjoute : 290sec
    Donc cette solution n'était pas viable... J'ai utilisé la syntaxe montrée dans l'aide en ligne : HEcrit(Client, HNbEnr() + 1)
    Le HEcrit prend 190sec, le HNbEnr 170sec aussi et le hReindexe 23sec

    La meilleure solution pour le moment que j'ai trouvé est de passer par des requetes SQL d'insertion multiple. Je dois ajouter près d'un million d'enregistrements. Je faire donc une requete toutes les 25000 enregistrements et cela passe sans problème : 105sec ! Une seule requête ne fonctionne pas car la chaine doit dépasser la mémoire vive disponible.
    Google est ton ami !

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 053
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 053
    Points : 9 392
    Points
    9 392
    Par défaut
    Avec hecrit() +hreindexe(), en remplacant hNbEnr()+1 par hValMax, tu aurais économisé les 170 secondes correspondantes.

    Mais je découvre la requête d'insertion multiple !
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Membre averti Avatar de LeonCosnyd
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 439
    Points : 368
    Points
    368
    Par défaut
    Merci pour l'information. Je n'ai pas vu cette syntaxe dans l'aide.
    Google est ton ami !

Discussions similaires

  1. le sleep plante mon programme
    Par chrisgwet dans le forum Visual Studio
    Réponses: 2
    Dernier message: 21/09/2012, 10h34
  2. QMessageBox qui plante un programme
    Par the_angel dans le forum Qt
    Réponses: 4
    Dernier message: 16/04/2012, 13h11
  3. Ma souris logitech m'a planté mon programme!
    Par lima64 dans le forum Visual C++
    Réponses: 0
    Dernier message: 08/02/2009, 01h50
  4. fonction qui plante mon programme
    Par étoile de mer dans le forum Débuter
    Réponses: 21
    Dernier message: 22/08/2008, 15h08
  5. pourquoi un free plante le programme?
    Par gronaze dans le forum C
    Réponses: 7
    Dernier message: 20/03/2006, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo