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

    Informations forums :
    Inscription : novembre 2007
    Messages : 341
    Points : 301
    Points
    301

    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
    Veuillez (s'il vous plait) suivre le protocole RTFM :
    Google est ton ami !
    Dans le doute, reboot ! (ke)

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    décembre 2013
    Messages
    1 352
    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 : 1 352
    Points : 2 876
    Points
    2 876

    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 du Club
    Homme Profil pro
    Responsable support / Développeur
    Inscrit en
    mars 2017
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Responsable support / Développeur

    Informations forums :
    Inscription : mars 2017
    Messages : 31
    Points : 49
    Points
    49

    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
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2007
    Messages : 341
    Points : 301
    Points
    301

    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.
    Veuillez (s'il vous plait) suivre le protocole RTFM :
    Google est ton ami !
    Dans le doute, reboot ! (ke)

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    décembre 2013
    Messages
    1 352
    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 : 1 352
    Points : 2 876
    Points
    2 876

    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
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2007
    Messages : 341
    Points : 301
    Points
    301

    Par défaut

    Merci pour l'information. Je n'ai pas vu cette syntaxe dans l'aide.
    Veuillez (s'il vous plait) suivre le protocole RTFM :
    Google est ton ami !
    Dans le doute, reboot ! (ke)

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