--- dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupMain.java 2014/12/10 09:58:28 2243 +++ dao/FuldDaekningWorker/src/dk/daoas/fulddaekning/LookupMain.java 2015/06/14 15:15:00 2589 @@ -1,13 +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.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"; @@ -23,12 +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(); - static Adresse[] alleDaekkedeAdresser; + private static List alleDaekkedeAdresser; + public static void main(String[] args) throws Exception { @@ -51,15 +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(); - - max_workers = cores - 1; //Efterlad 1 core/cpu i reserve til systemet - - } - logger.info("Starting with MAX_WORKERS:" + max_workers); verbose = Boolean.parseBoolean( conf.getSafeProperty("VERBOSE") ); @@ -76,42 +75,76 @@ Constants consts = Constants.getInstance(); Database db = new Database(conf); - - + Adresse ikkeDaekkede[] = db.hentAlleIkkedaekkedeAdresser(consts.getMinPostnr(), consts.getMaxPostnr() ); boolean testRun= false; + int antalFundne = 0; + long start = System.currentTimeMillis(); if (testRun == false) { logger.info("Finder postnumre"); - List postnumre = db.hentPostnumre(); + Set postnumre = db.hentPostnumreCache(); // Først validerer vi BBox på alle postnummre, for at undgå fuldt stop midt i beregningen - for(String postnr : postnumre) { // + for(short postnr : postnumre) { // logger.info("Validerer BBox for " + postnr); BoundingBox bbox = db.getBoundingbox(postnr); bbox.validateBbox(); } - if (consts.doExtendedLookup()) { - logger.info("Henter alle daekkede adresser"); - alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); - logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.length); - } + + logger.info("Henter alle daekkede adresser"); + alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); + 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(String postnr : postnumre) { - Lookup lookup = new Lookup(postnr, db); - lookup.doLookup(); + + 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); + } + } + } + db.saveBatch(); + if (rename_tables) { db.renameResultTables(); } else { @@ -122,44 +155,31 @@ } else { /// Test + /* db.resetResultTable(); - if (consts.doExtendedLookup()) { - alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); - logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.length); - } - - Lookup lookup = new Lookup("458x", db); - lookup.doLookup(); + + alleDaekkedeAdresser = db.hentAlleDaekkedeAdresser(); + logger.info( "AlleDaekkedeAdresser.length=" + alleDaekkedeAdresser.size()); + + short post = (short) 2700; + Lookup lookup = new Lookup(post, db, threadPool); + lookup.doLookup();*/ } + 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) ); + logger.info("Antal daekkede : " + alleDaekkedeAdresser.size() ); + logger.info("Antal ikke-daekkede : " + ikkeDaekkede.length ); + logger.info("Heraf, antal fundne : " + antalFundne ); + logger.info("Fandt adresser til : " + (antalFundne*100.0)/ikkeDaekkede.length + "%" ); } - 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; @@ -168,5 +188,6 @@ int hours = (int) ((milliseconds / (1000*60*60)) % 24); return String.format("%02d:%02d:%02d.%03d", hours, minutes, seconds, mseconds); - } + } + }