Author: chatellier Date: 2009-05-25 13:24:45 +0000 (Mon, 25 May 2009) New Revision: 2269 Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationMonitor.java Log: Parcours la liste des simulations en 2 temps (dossier/storage), c'est lent seulement pour la derniere boucle Modified: isis-fish/trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationMonitor.java =================================================================== --- isis-fish/trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationMonitor.java 2009-05-25 13:23:59 UTC (rev 2268) +++ isis-fish/trunk/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationMonitor.java 2009-05-25 13:24:45 UTC (rev 2269) @@ -30,6 +30,7 @@ import java.util.Date; import java.util.Iterator; import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.Properties; import java.util.SortedSet; @@ -638,48 +639,15 @@ // this is a sensitivity simulation String simulationId = job.getId(); String simulationCommonPrefix = simulationId.substring(0, simulationId.lastIndexOf("_")); - - // simulation start at 0 - LinkedList<SimulationStorage> simulationStorageForAnalyze = new LinkedList<SimulationStorage>(); - // en sens inverse, il le fera carrement moins souvent - for (int simulationIndex = numberOfSimulation - 1; simulationIndex >= 0 ; --simulationIndex) { - String currentId = simulationCommonPrefix + "_" + simulationIndex; - if (SimulationStorage.localyExists(currentId)) { - SimulationControl currentSimulationControl = new SimulationControl(currentId); - SimulationStorage.readControl(currentId, currentSimulationControl); - - // condition for simulation "end" - if (currentSimulationControl.getProgress() > 0 - && currentSimulationControl.getProgress() >= currentSimulationControl.getProgressMax()) { - SimulationStorage storage = SimulationStorage.getSimulation(currentId); - // always add first (loop in reverse order) - // result list is keeped sorted - simulationStorageForAnalyze.addFirst(storage); - if (log.isDebugEnabled()) { - log.debug("Found simulation number = " + simulationIndex); - } - } - else { - if (log.isDebugEnabled()) { - log.debug("Miss simulation number = " + simulationIndex); - } - - // no need to continue - // if only miss one, break - break; - } - } - else { - break; - } - } + int numberFinished = getNumberOfFinishedSimulation(simulationCommonPrefix, numberOfSimulation); // si on a toutes les simulation est qu'elles sont finie // on construit la liste des simulation storage // et on l'envoie au script d'analyse de sensibilite - if (simulationStorageForAnalyze.size() == numberOfSimulation) { + if (numberFinished == numberOfSimulation) { + // FIXME buggy because of hack in getParameter() - // getRegion() from simulation can be lockek + // getRegion() from simulation can be locked SimulationParameter params = simulation.getParameter(); SensitivityCalculator sensitivityCalculator = params.getSensitivityCalculator(); if (sensitivityCalculator != null) { @@ -687,6 +655,9 @@ log.debug("Call analyzeResult on sensitivity script " + sensitivityCalculator.getClass().getSimpleName()); } try { + // get full storage list + List<SimulationStorage> simulationStorageForAnalyze = + getStorageListForSecondPass(simulationCommonPrefix, numberOfSimulation); // build master sensitivity export directory File masterExportDirectory = new File(IsisFish.config.getDefaultExportDirectory(), simulationCommonPrefix); // directory must already exists !!! @@ -703,6 +674,76 @@ } /** + * Parcourt le dossier de toutes les simulation commencant par le prefix donné, + * et retourne le nombre de simulation terminées. + * + * @param asPrefixName simulation name (without number suffix) + * @param numberOfSimulation total simulation number + * + * @return le nombre de simulation réellement terminée + */ + protected int getNumberOfFinishedSimulation(String asPrefixName, int numberOfSimulation) { + + int numberOfFinishedSimulation = 0; + + // en sens inverse, il le fera carrement moins souvent + for (int simulationIndex = numberOfSimulation - 1; simulationIndex >= 0 ; --simulationIndex) { + String currentId = asPrefixName + "_" + simulationIndex; + if (SimulationStorage.localyExists(currentId)) { + SimulationControl currentSimulationControl = new SimulationControl(currentId); + SimulationStorage.readControl(currentId, currentSimulationControl); + + // condition for simulation "end" + if (currentSimulationControl.getProgress() > 0 + && currentSimulationControl.getProgress() >= currentSimulationControl.getProgressMax()) { + + // new finished simulation found + numberOfFinishedSimulation++; + } + else { + if (log.isDebugEnabled()) { + log.debug("Miss simulation number = " + simulationIndex); + } + + // no need to continue + // if only miss one, break + break; + } + } + else { + break; + } + } + + return numberOfFinishedSimulation; + } + + /** + * Parcourt les dossiers et instancie les storages une fois + * qu'on est sur qu'on a toutes les simulations. + * + * @param asPrefixName simulation name (without number suffix) + * @param numberOfSimulation total simulation number + * + * @return la liste des storages + */ + protected List<SimulationStorage> getStorageListForSecondPass(String asPrefixName, int numberOfSimulation) { + + // simulation start at 0 + List<SimulationStorage> simulationStorageForAnalyze = new LinkedList<SimulationStorage>(); + // en sens inverse, il le fera carrement moins souvent + for (int simulationIndex = 0; simulationIndex < numberOfSimulation; ++simulationIndex) { + String currentId = asPrefixName + "_" + simulationIndex; + SimulationStorage storage = SimulationStorage.getSimulation(currentId); + // always add first (loop in reverse order) + // result list is keeped sorted + simulationStorageForAnalyze.add(storage); + } + + return simulationStorageForAnalyze; + } + + /** * Convertit une collection de string, en une chaine * séparée par des ",". *