--- dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupMain.java 2015/06/14 07:58:55 2584 +++ dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupMain.java 2015/06/14 14:28:21 2585 @@ -1,16 +1,24 @@ package dk.daoas.fulddaekning; +import geocode.GeoPoint; +import geocode.kdtree.KDTree; + import java.io.File; import java.io.FileReader; +import java.sql.SQLException; +import java.util.List; import java.util.Set; -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; import java.util.logging.FileHandler; +import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; public class LookupMain { + + static class LookupResult { + double bedsteAfstand = 9999999.999; + Adresse bedsteAdr = null; + } static final String CONFIG_FILENAME = "fulddaekning.properties"; @@ -26,18 +34,9 @@ final static Logger logger = Logger.getLogger( LookupMain.class.toString() ); - static Statistik flestDaekkede = new Statistik(); - static Statistik flestIkkeDaekkede = new Statistik(); - static Statistik mestBrugteTid = new Statistik(); - static Statistik stoersteDataset = new Statistik(); - private static Adresse[] alleDaekkedeAdresser; + private static List alleDaekkedeAdresser; - static ThreadPoolExecutor threadPool; - - private static void setupThreadPool() { - threadPool = (ThreadPoolExecutor) Executors.newFixedThreadPool(max_workers, new WorkerThreadFactory() ); - } public static void main(String[] args) throws Exception { @@ -60,17 +59,6 @@ conf = new SafeProperties(); conf.load( new FileReader(confFile) ); - 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(); verbose = Boolean.parseBoolean( conf.getSafeProperty("VERBOSE") ); @@ -87,7 +75,7 @@ Constants consts = Constants.getInstance(); Database db = new Database(conf); - db.hentAlleIkkedaekkedeAdresser(consts.getMinPostnr(), consts.getMaxPostnr() ); + Adresse ikkeDaekkede[] = db.hentAlleIkkedaekkedeAdresser(consts.getMinPostnr(), consts.getMaxPostnr() ); boolean testRun= false; @@ -110,16 +98,47 @@ logger.info("Henter alle daekkede adresser"); alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); - logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.length); + logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.size()); + + KDTree addressTree = new KDTree(alleDaekkedeAdresser); - //pre-check er ok - reset tmp tabel og start søgningen db.resetResultTable(); + + logger.info("Starter beregning"); + + final int workerId = -1; + //pre-check er ok - reset tmp tabel og start søgningen + + for (Adresse qAdresse : ikkeDaekkede) { + + + LookupResult result = new LookupResult(); + result.bedsteAdr = (Adresse) addressTree.findNearest(qAdresse); + result.bedsteAfstand = GeoPointHelper.beregnAfstand(qAdresse, result.bedsteAdr); - for(short postnr : postnumre) { - Lookup lookup = new Lookup(postnr, db, threadPool); - lookup.doLookup(); + + + if (result.bedsteAfstand <= consts.getMaxDistance() ) { //Gem kun hvis distancen er under max_distance for distributøren + if (LookupMain.verbose == true) { + logger.fine("(" +workerId + ") Bedste: " + qAdresse + "==>" + result.bedsteAdr + " ::: " + result.bedsteAfstand ); + } + + 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 { + System.out.println("For stor afstand: " + qAdresse + " > " + result.bedsteAfstand); + } + } + db.saveBatch(); + if (rename_tables) { db.renameResultTables(); } else { @@ -130,46 +149,27 @@ } else { /// Test + /* db.resetResultTable(); alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); - logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.length); + logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.size()); short post = (short) 2700; Lookup lookup = new Lookup(post, db, threadPool); - lookup.doLookup(); + lookup.doLookup();*/ } - threadPool.shutdown(); long now = System.currentTimeMillis(); long elapsed = now - start ; - logger.info("Mest brugte tid: " + mestBrugteTid); - logger.info("Flest Ikke-dækkede, " + flestIkkeDaekkede); - logger.info("Flest Dækkede, " + flestDaekkede); - logger.info("Største Dataset, " + stoersteDataset); + logger.info("Fuld load done : " + formatMilliSeconds(elapsed) ); } - public static void saveStatistics(Statistik stat) { - if (stat.antalDaekkede > flestDaekkede.antalDaekkede) { - flestDaekkede = stat; - } - if (stat.antalIkkeDaekkede > flestIkkeDaekkede.antalIkkeDaekkede) { - flestIkkeDaekkede = stat; - } - - if (stat.totalDataset > mestBrugteTid.totalDataset) { - stoersteDataset = stat; - } - - if (stat.forbrugtTid > mestBrugteTid.forbrugtTid) { - mestBrugteTid = stat; - } - } static String formatMilliSeconds(long milliseconds) { int mseconds = (int) milliseconds % 1000; @@ -180,12 +180,4 @@ return String.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, mseconds); } - static class WorkerThreadFactory implements ThreadFactory { - int count = 0; - - @Override - public Thread newThread(Runnable r) { - return new Thread(r, "lookupWorker/" + count++); - } - } }