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

Java Discussion :

[Perf]Probleme de rapidité d'execution


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 37
    Points : 14
    Points
    14
    Par défaut [Perf]Probleme de rapidité d'execution
    Bonjour,

    j'ai un programme java qui me permet de télécharger des data d'un fichier brut vers une table très simple!

    Apres je dois lancer une nouvelle fonction qui permet de spliter c'est donnée en champs concret dans ma bd!


    le problème vient du faites que les donnée n'ont pas le temps de terminer leur load avant mon split

    Pourriez vous m'aidée?

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                    Runtime r = Runtime.getRuntime(); 
                    Process p = r.exec(m_cmd); 
                    p.waitFor();
    Je vous mets ça car je suis pratiquement sure que le problème vient du waitfor!

    Merci d'avance pour votre aide

    v

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 154
    Points : 143
    Points
    143
    Par défaut
    Salut,

    Est ce que tu pourrais préciser un peu. Car avec juste ce que tu nous a mis on ne peux pas trop t'aider. C'est un code assez standard.

    Que ce passe t'il avant que ces lignes de codes soient executees? Que contient la variable m_cmd? Que se passe t'il après?

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Tu fais dormir ton process c'est tu veux qu'il aille plus lentement:
    Tu fais un thread.

    Fifi

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 37
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par fidififouille
    Tu fais dormir ton process c'est tu veux qu'il aille plus lentement:
    Tu fais un thread.

    Fifi
    on fais comment encore

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 37
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Tiaps
    Salut,

    Est ce que tu pourrais préciser un peu. Car avec juste ce que tu nous a mis on ne peux pas trop t'aider. C'est un code assez standard.

    Que ce passe t'il avant que ces lignes de codes soient executees? Que contient la variable m_cmd? Que se passe t'il après?
    CMD contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    String m_cmd = "cmd /C F:\\oracle\\ora92\\bin\\sqlldr pyrites_bel/pyrites@orcl control="
                        + m_filecomplet + ".ctl data="
                        + m_filecomplet + ".txt log="
                        + m_filecomplet + ".log bad="
                        + m_filecomplet + ".bad";
    j'ai un blocage de pres de 4 min et il ne lance pas ma proc oracle comme il faut apres

  6. #6
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    Citation Envoyé par Vempiria
    on fais comment encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class PrimeThread extends Thread {
             long minPrime;
             PrimeThread(long minPrime) {
                 this.minPrime = minPrime;
             }
     
             public void run() {
                 // compute primes larger than minPrime
                  . . .
             }
         }
    Issu de http://javasearch.developpez.com/j2s...ng/Thread.html

    Après, tu n'as qu'à mettre le code que tu veux voir éxécuter dans la méthode run de ton thread.

    Par contre, je ne comprend pas trop ce que tu veux faire, alors je vais avoir du mal à détailler plus.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 37
    Points : 14
    Points
    14
    Par défaut
    Je dois executer un fichier brut de donnée qui est loader dans une table sql a deux champs

    le tout a l'aide des commande citer ci dessus

    et ensuite j'appelle une proc oracle dans le java tjrs qui eclate les donnée pour les mettre dans une table de verification

    mon probleme est que a la place d'avoir x milliers de champs eclater ben y en a plus que 8

    donc, je pense que le loader va pas a ssez vite

    mais le waitfor deconne aussi!

  8. #8
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 251
    Points
    1 251
    Par défaut
    En gros tu veux que ton soft attende gentillement que tout ton fichier soit charger dans ta BD avant que Oracle ne commence à faire sont travail.

    Le plus simple me semble-t'il reste bel est bien de faire un thread.

    Le principe : tu instancies 2 threads. Le premier va s'occuper de charger les données depuis le fichier dans la base, le second va lancer Oracle. Pour que Oracle ne commence pas trop tôt, il faut que tu synchronise ton 2ème thread sur le premier (en gros ton second thread au lieu de travailler en parallèle du pemier va travailler en série...)

    Je suis vraiment désolé, mais les restes de codes qui me restent en tête sont trop flou pour que je puisse te les donner sans te faire perdre du temps. J'aurais bien un copier/coller de mon code à te filer, mais mon PC perso viens de griller, et il vient de partir en SAV-garantie.

    Par contre, c'est excessivement facile de mettre en place deds thread avec Java, et il m'a fallu moins de 2heures pour mettre en place ce que je viens de te dire (synchronisation et instanciation). Mais je n'ai pas le temps (ni forcément l'envie) de le faire pour toi. Alors Tutorials, Google et Recherche avancée sur le Forum.

    Au passage, je pense que cela te sera très utiles, les cours de formation et tutoriels pour apprendre la programmation Java : http://java.developpez.com/cours/

  9. #9
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Bonjour,

    Je pense sqlldr est un exe donc tu n'as pas besoin d'ouvrir un shell 'cmd /C'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    String[] m_cmd = {"F:\\oracle\\ora92\\bin\\sqlldr",
                                "pyrites_bel/pyrites@orcl",
                                 "control=" + m_filecomplet + ".ctl",
                                 "data=" + m_filecomplet + ".txt",
                                 "log=" + m_filecomplet + ".log",
                                  "bad=" + m_filecomplet + ".bad"};
    Runtime r = Runtime.getRuntime(); 
    Process p = r.exec(m_cmd); 
    int status = p.waitFor(); 
    /* Teste le status retourné par sqlldr: 0 pas d'erreur */
    Ce code supoose que sqlldr ne lit et n'écrit aucune donnée depuis son entrée standard, sa sortie standard ou sa sortie d'erreur.

    Il préférable de passer les arguments avec un array de String.

    On doit toujours vérifier le status (valeur retournée par waitFor) que le sous-processus retourne.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 37
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par jowo
    Bonjour,

    Je pense sqlldr est un exe donc tu n'as pas besoin d'ouvrir un shell 'cmd /C'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    String[] m_cmd = {"F:\\oracle\\ora92\\bin\\sqlldr",
                                "pyrites_bel/pyrites@orcl",
                                 "control=" + m_filecomplet + ".ctl",
                                 "data=" + m_filecomplet + ".txt",
                                 "log=" + m_filecomplet + ".log",
                                  "bad=" + m_filecomplet + ".bad"};
    Runtime r = Runtime.getRuntime(); 
    Process p = r.exec(m_cmd); 
    int status = p.waitFor(); 
    /* Teste le status retourné par sqlldr: 0 pas d'erreur */
    Ce code supoose que sqlldr ne lit et n'écrit aucune donnée depuis son entrée standard, sa sortie standard ou sa sortie d'erreur.

    Il préférable de passer les arguments avec un array de String.

    On doit toujours vérifier le status (valeur retournée par waitFor) que le sous-processus retourne.
    et tu me conseille de lancer comment?

  11. #11
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Je te conseille de le lancer directement comment je te l'ai montré dans mon code.

    Petite correction à mon code, ajoute l'extension '.exe' au fichier sqlldr.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    String[] m_cmd = {"F:\\oracle\\ora92\\bin\\sqlldr.exe", 
                                "pyrites_bel/pyrites@orcl", 
                                 "control=" + m_filecomplet + ".ctl", 
                                 "data=" + m_filecomplet + ".txt", 
                                 "log=" + m_filecomplet + ".log", 
                                  "bad=" + m_filecomplet + ".bad"}; 
    Runtime r = Runtime.getRuntime(); 
    Process p = r.exec(m_cmd); 
    int status = p.waitFor(); 
    /* Teste le status retourné par sqlldr: 0 pas d'erreur */
    IMPORTANT: Teste la valeur retournée par waitFor avant de continuer avec le traitement suivant, en plus il faudrait pouvoir anaylser le contenu du fichier LOG pour être sûr que tout est en ordre avant de poursuivre.

Discussions similaires

  1. Probleme à la génération d un executable
    Par mkachakh dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 04/09/2007, 16h15
  2. Probleme ogre3d :Ou est l'executable ?
    Par 3dkingdom dans le forum Ogre
    Réponses: 4
    Dernier message: 23/07/2007, 14h46
  3. probleme code vba ne s'execute pas apres instruction sql
    Par arnogef dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 29/12/2005, 13h34
  4. [Perf]Probleme de lenteur connexion
    Par mermoz dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 09/11/2005, 18h53

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