Bonjour,

1) J'ai un exécutable externe à JAVA qui prend en entrée un fichier et m'en ressort un autre après traitement

2) J'ai besoins de faire varier des valeurs dans le fichier d'entrée et de lire le fichier de résultat pour trouver les meilleurs valeurs.

3) Les valeurs en entrée sont généré par une fonction récursive qui incrémente chaque paramètre pour obtenir toute les combinaisons possible.

4) Lorsque j’exécute le programme externe dans la méthode récursive cela fonctionne très bien mais je suis obliger de laisser tourner toute une nuit pour obtenir des valeurs vu que la consommation CPU n’excède pas les 10%

5) J'essais maintenant de lancer plusieurs programme en parallèle en utilisant ExecutorService pour gérer le nombre et le programme externe est exécuté via un ProcessBuilder

666) C'est là que ça ce gâte.
Dans une simple boucle FOR j'ai bien le nombre d’exécutable défini par l'ExecutorService lancé en même temps mais lorsque je place l’exécution dans ma fonction récursive je n'ai aucune variation des données. En fait si, j'ai une variation au tout début mais après plus rien.



L'utilisation du ExecutorService

Code : Sélectionner tout - Visualiser dans une fenêtre à part
ExecutorService exec = Executors.newFixedThreadPool(8);
La génération des combinaisons avec Nom, borne basse, borne haute et incrément:
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
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
    public static void combinaison() {
        List<Param> listeParam = Arrays.asList(
                new Param("PARAM_ID", 2, 15, 1),
                new Param("PARAM_RA", 0, 25, 5),
                new Param("PARAM_RB", 0, 100, 10),
                new Param("PARAM_RC", 40, 500, 20),
                new Param("PARAM_RD", 20, 300, 20)
        );
 
        long nbrCombinaison = 1;
        for (Param param : listeParam) {
            long diff = (param.max - param.min);
            long inc = diff / param.inc + 1;
            nbrCombinaison = nbrCombinaison * inc;
        }
        System.out.println("Nombre de combinaison : "+nbrCombinaison);
        recur(listeParam, 0);
    }
 
    private static  void recur(List<Param> listeParam, int index) {
        Param param = listeParam.get(index);
        while (param.value <= param.max) {
            if (index < listeParam.size() - 1) {
                recur(listeParam, index + 1);
                param.value = param.value + param.inc;
            } else {
                exec.execute(new ProcessRunnable(nbr,listeParam));
                nbr++;
                param.value = param.value + param.inc;
            }
        }
        param.value = param.min;
    }
Comme vous pouvez le voir j'ai un Runnable qui est placé dans la fonction récursive qui va lire la combinaison courante. (L28)

Le programme est exécuté comme ceci dans le Runnable :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
new ProcessBuilder(".exe" ,"-b", file).start().waitFor();
Pouvez vous m'aider ?

Si vous avez besoins d'autre bout de code ...

Merci