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

Langage Java Discussion :

Taille limite pour un BufferedReader


Sujet :

Langage Java

  1. #1
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut Taille limite pour un BufferedReader
    Bonjour à tous !
    Alors voilà une question à la c.. :
    J'exécute un script ksh sur unix ( AIX en fait ) via Runtime et Process, puis récupère la sortie standar via un BuffereReader ( proc.getInputStream() ).
    Jusque là tout va bien pour des commandes simples ( n'affichant pas grand-chose ).
    Le problème est que le script génère environ 300 000 lignes soit 8 MO de données, et j'ai beau laisser tourner ( 48h ), l'exécution de la commande semble boucler ( alors qu'en ligne de commande, 5 minutes suffisent à afficher tout dans la console ).
    J'ai essayer d'utiliser un waitFor avant de récupérer la sortie, mais en vain, toujours le même problème.

    D'où ma question :
    Le BufferedReader n'est-il pas limité en taille ( détail que je n'ai point vu dans la javadoc ) ?

    PS. J'ai résolu mon problème en éxécutant le script de telle manière qu'il redirige la sortie standard dans un fichier. Fichier que je lis ensuite sans problème :
    monScript.ksh 1> resultat.txt

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il faudrait voir ton code...

    a++

  3. #3
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Bon voilà, je ne mets que le nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    PrintWriter pw=new PrintWriter(new FileOutputStream("./xrefUxCmd.tmp"),true);
    pw.println(". /universe/"+societe+"/mgr/uxsetenv");
    String esp=null;
    if(space.equalsIgnoreCase("exp")) esp="X";
    if(space.equalsIgnoreCase("app")) esp="A";
    if(space.equalsIgnoreCase("sim")) esp="S";
    if(space.equalsIgnoreCase("int")) esp="I";
    pw.println("export S_ESPEXE="+esp);
    pw.println(cmd);
    pw.close();
    Process pCM=Runtime.getRuntime().exec("chmod +x ./xrefUxCmd.tmp");
    pCM.waitFor();
    Process pEX=Runtime.getRuntime().exec("sh ./xrefUxCmd.tmp");
    BufferedReader out=new BufferedReader(new InputStreamReader(pEX.getInputStream()));
    pEX.waitFor();
    En fait tout se bloque avec le pEX.waitFor();
    La commande à executer est dans la variable "cmd", en fait c'est pour lister tout en tas d'objets dans un logiciel ( $universe ). Si je paramètre celle-ci pour effectuer un filtre ( pas beaucoup de lignes en sortie ) tout ce passe bien. Mais lorsque la commande généère plusieurs centaines de milliers de lignes. L'application semble se bloquer et tourner dans le vide ( pas de temps processeur utilisé ).
    Je précise qu'au bout de 48h, c'est toujours dans le même état alors que dans la console, la commande prend environ 5 minutes.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    C'est normal puisque il y a un deadlock dans ton code...

    Je m'explique : l'InputStream que tu recois est lié avec la sortie de l'application que tu lances. Il possède son propre buffer entre les deux applications (ton application Java et l'application "native"). La taille de ce buffer est limité (et dépend de l'OS il me semble).

    Ainsi tu es obligé de lire le flux pour que l'application "native" puisse écrire dedans. Lorsque le process remplit complètement le buffer, le prochain appel à une méthode d'écriture bloquera jusqu'à ce que le buffer soit vidé (ie : lu par ton application).

    Or tu attends que le process soit terminée avant de lire les données.
    Donc :
    • Ton application attent que le process soit terminé pour lire les données.
    • Le process a remplit le buffer et restera bloqué tant que ton application ne lit pas les données
    deadlock !!!


    Tu dois donc lire les données AVANT le waitFor(), et je te conseille de fermer les flux inutilisés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
            Process pCM=Runtime.getRuntime().exec("chmod +x ./xrefUxCmd.tmp");
            /* On ferme les flux que l'on n'utilises pas : */
            pCM.getOutputStream().close(); // STDIN
            pCM.getInputStream().close(); // STDOUT
            pCM.getErrorStream().close(); // STDERR
            pCM.waitFor();
     
            Process pEX=Runtime.getRuntime().exec("sh ./xrefUxCmd.tmp");
            /* On ferme les flux que l'on n'utilises pas : */
            pEX.getOutputStream().close(); // STDIN
            pEX.getErrorStream().close(); // STDERR
     
            BufferedReader out=new BufferedReader(new InputStreamReader(pEX.getInputStream()));
            String line;
            while ( (line=out.readLine()) != null ) {
                // code
                System.out.println(line);
            }
            pEX.waitFor();
    Et si tu dois lire les données du stderr, il faudra le faire depuis un thread séparé ou utilisé la classe ProcessBuilder de Java 5.0 qui permet de regrouper stdout et stderr...

    a++

  5. #5
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Pourquoi n'y ai-je pas pensé plus tôt
    Enfin c'est toujours la même chose, ça parait toujours trivial lorsque l'on a compris d'où venait l'erreur.
    En tout cas, un grand merci à toi !
    Je testerai la modif demain matin au boulot.

    PS. Pour la fermeture des flux, c'était fait un peu plus loin dans le code , enfin c'est plus propre comme ça.


    EDIT : Je viens de faire la modif et effectivement c'était bien ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Taille limite pour une table?
    Par NicolasTT dans le forum Administration
    Réponses: 2
    Dernier message: 20/07/2012, 16h40
  2. Taille limitée pour Javascript ?
    Par pascal_06 dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 08/02/2011, 22h00
  3. [Tableaux] Une taille limite pour un array ?
    Par Xunil dans le forum Langage
    Réponses: 12
    Dernier message: 05/12/2006, 14h09
  4. [Système] Taille limite pour fopen ?
    Par blinkseb dans le forum Langage
    Réponses: 1
    Dernier message: 16/05/2006, 14h54
  5. [FLASH MX] Taille limite pour les images
    Par ptijo dans le forum Flash
    Réponses: 1
    Dernier message: 24/02/2006, 07h53

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