--- dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupMain.java 2015/09/27 18:20:41 2708 +++ dao/FuldDaekningWorker/src/main/java/dk/daoas/fulddaekning/LookupMain.java 2015/10/02 09:34:36 2736 @@ -2,196 +2,182 @@ import java.io.File; import java.io.FileReader; -import java.sql.SQLException; -import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Queue; import java.util.Set; -import java.util.function.Consumer; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.FileHandler; -import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; import com.jwetherell.algorithms.data_structures.KdTree; -import dk.daoas.fulddaekning.osrm.OSRMHelper; public class LookupMain { - - static class LookupResult { - double bedsteAfstand = 9999999.999; - Adresse bedsteAdr = null; - } static final String CONFIG_FILENAME = "fulddaekning.properties"; - - static boolean rename_tables; + + static boolean test_mode; static SafeProperties conf; - + static int max_workers; static boolean verbose; - + static String distributor; final static Logger logger = Logger.getLogger( LookupMain.class.toString() ); - - - - static final int MAX_RESULTS = 100; - - static OSRMHelper osrmHelper = new OSRMHelper(); - - + + static ThreadPoolExecutor threadPool; + + private static void setupThreadPool() { + threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(max_workers, new WorkerThreadFactory() ); + } + + + public static void main(String[] args) throws Exception { - + //Setup j.u.l Logger Logger root = Logger.getLogger(""); FileHandler fhandler = new FileHandler("fulddaekning.log"); // Ingen max størrelse, ingen rotation og ingen append fhandler.setFormatter( new SimpleFormatter() ); root.addHandler( fhandler ); - - - - + + + + File confFile = new File( CONFIG_FILENAME ); if (! confFile.exists() ) { logger.warning("Config file not found: " + CONFIG_FILENAME); System.exit(1); } - + + int antalIkkeDaekkede = -1; + conf = new SafeProperties(); conf.load( new FileReader(confFile) ); - - - + + + verbose = Boolean.parseBoolean( conf.getSafeProperty("VERBOSE") ); logger.info("Starting with VERBOSE:" + verbose); - - rename_tables = Boolean.parseBoolean( conf.getSafeProperty("RENAMETABLES") ); - logger.info("Starting with RENAMETABLES:" + rename_tables); - + + test_mode = Boolean.parseBoolean( conf.getSafeProperty("TEST") ); + logger.info("Starting with TEST:" + test_mode); + distributor = conf.getSafeProperty("DISTRIBUTOR"); distributor = distributor.toUpperCase(); logger.info("Starting for DISTRIBUTOR:" + distributor); - + Constants.init(distributor); Constants consts = Constants.getInstance(); + + max_workers = Integer.parseInt( conf.getSafeProperty("MAX_WORKERS") ); + if (max_workers <= 0) { + logger.info("!!! AUTO-DETECT MAX_WORKERS !!!"); + int cores = Runtime.getRuntime().availableProcessors(); + cores -= 1;//Efterlad 1 core/cpu i reserve til systemet + + max_workers = Math.max(1, cores); //Dog skal der som minimum være 1 core til beregning + + } + logger.info("Starting with MAX_WORKERS:" + max_workers); + setupThreadPool(); + Database db = new Database(conf); - Adresse ikkeDaekkede[] = db.hentAlleIkkedaekkedeAdresser(consts.getMinPostnr(), consts.getMaxPostnr() ); - logger.info("Antal ikke-daekkede: " + ikkeDaekkede.length); - + Queue ikkeDaekkede = db.hentAlleIkkedaekkedeAdresser(consts.getMinPostnr(), consts.getMaxPostnr() ); + antalIkkeDaekkede = ikkeDaekkede.size(); + logger.info("Antal ikke-daekkede: " + antalIkkeDaekkede ); + + + boolean testRun= false; - - int antalFundne = 0; - + + AtomicInteger antalFundne = new AtomicInteger(0); + long beregnStart =0; long start = System.currentTimeMillis(); int antalDaekkedeAdresser = -1; - + if (testRun == false) { - + logger.info("Finder postnumre"); Set postnumre = db.hentPostnumreCache(); - + // Først validerer vi BBox på alle postnummre, for at undgå fuldt stop midt i beregningen for(short postnr : postnumre) { // logger.info("Validerer BBox for " + postnr); BoundingBox bbox = db.getBoundingbox(postnr); bbox.validateBbox(); } - + logger.info("Henter alle daekkede adresser"); antalDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); logger.info( "AlleDaekkedeAdresser.length=" + antalDaekkedeAdresser ); - + Map> addrHoList = db.getDaekkedeAdresserHO(); - + Map> hoTrees = new HashMap>(); - + for ( Map.Entry> entry : addrHoList.entrySet() ) { short ho = entry.getKey(); List geopoints = entry.getValue(); - + logger.info("Opbygger KDTree for " + ho + " - antal=" + geopoints.size() ); - + @SuppressWarnings("unchecked") List tmpPoints = (List)(List) geopoints; - + KdTree addressTree = new KdTree( tmpPoints ); hoTrees.put(ho, addressTree); } - + db.resetResultTable(); - + beregnStart = System.currentTimeMillis(); logger.info("Starter beregning"); - - final int workerId = -1; - //pre-check er ok - reset tmp tabel og start søgningen - - for (Adresse qAdresse : ikkeDaekkede) { - - short ho = qAdresse.ho; - KdTree addressTree = hoTrees.get(ho); - - LookupResult result = new LookupResult(); - Collection res = addressTree.nearestNeighbourSearch(MAX_RESULTS, qAdresse); - if (res.size() > MAX_RESULTS ) { - System.out.println("Returnerede mere end MAX_RESULTS> " + res.size() ); - System.exit(0); - } - - - result.bedsteAdr = osrmHelper.getNearestViaTable(qAdresse, res); - System.out.println("Bedste:" + result.bedsteAdr ); - result.bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, result.bedsteAdr); + //pre-check er ok - reset tmp tabel og start søgningen + CyclicBarrier barrier = new CyclicBarrier(LookupMain.max_workers + 1); - if (result.bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren - if (verbose == true) { - logger.fine("(" +workerId + ") Bedste: " + qAdresse + "==>" + result.bedsteAdr + " ::: " + result.bedsteAfstand ); - } - - antalFundne++; - - try { - db.gemResultat(qAdresse, result.bedsteAdr, result.bedsteAfstand); - } catch (SQLException e) { - logger.log(Level.WARNING, "Error saving result", e); - logger.warning("Shutting down"); - - System.exit(0); //hvis at indsættelsen fejler skal vi afbryde med det samme - } - } else { - if (verbose == true) { - System.out.println("For stor afstand: " + qAdresse + " > " + result.bedsteAfstand); - } - } - + for (int i=0; i