--- dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/AfstandAndenRuteTask.java 2016/02/13 13:16:34 2946 +++ dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/AfstandAndenRuteTask.java 2016/03/29 20:36:40 2994 @@ -7,13 +7,13 @@ import java.util.Queue; import java.util.Set; import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.atomic.AtomicInteger; import ags.utils.dataStructures.trees.thirdGenKD.KdTree; -import dk.daoas.adressevedligehold.ReloadHelper; +import dk.daoas.adressevedligehold.ReloadTask; import dk.daoas.adressevedligehold.ServiceConfig; import dk.daoas.adressevedligehold.beans.Address; import dk.daoas.adressevedligehold.db.DBConnection; @@ -23,23 +23,27 @@ public class AfstandAndenRuteTask extends Task { + private TaskLogger logger = TaskLogger.getInstance(); final static boolean VERBOSE = false;// + + public final static String INCREMENTAL = "INCREMENTAL"; + public final static String FULL = "FULL"; static boolean test_mode; String distributor; - int antalIkkeDaekkede = -1; + int antalIkkeDaekkede = 0; AtomicInteger antalBeregnet = new AtomicInteger(); - ThreadPoolExecutor threadPool; + ExecutorService threadPool; boolean isIncremental; @@ -49,10 +53,10 @@ type = type.toUpperCase(); switch(type) { - case "FULL": + case FULL: isIncremental = false; break; - case "INCREMENTAL": + case INCREMENTAL: isIncremental = true; break; default: @@ -81,130 +85,143 @@ max_workers = 1; } logger.info("Starting with MAX_WORKERS:" + max_workers); - setupThreadPool(max_workers); + + threadPool = Executors.newFixedThreadPool(max_workers, new WorkerThreadFactory() ); logger.info("Starting with INCREMENTAL:" + isIncremental); - try (Connection conn = DBConnection.getConnection() ) { - DatabaseRouteDistance db = new DatabaseRouteDistance(conn, isIncremental); - - db.prepareIncrementalSearch(); - - Queue
ikkeDaekkede = db.hentAlleIkkedaekkedeAdresser(consts.getMinPostnr(), consts.getMaxPostnr() ); - antalIkkeDaekkede = ikkeDaekkede.size(); - logger.info("Antal ikke-daekkede: " + antalIkkeDaekkede ); - - - boolean testRun= false; - - 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(distributor); - 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() ); - int bucketSize = 96*12; + AtomicInteger antalFundne = new AtomicInteger(0); - KdTree
addressTree = new KdTree
( 3, bucketSize ); - for(Address a: geopoints) { - addressTree.addPoint(a.xyz, a); - } + long start = System.currentTimeMillis(); + AtomicInteger antalDaekkedeAdresser = new AtomicInteger(-1); - hoTrees.put(ho, addressTree); - } - db.resetResultTable(); + // MAIN RUN START - beregnStart = System.currentTimeMillis(); - logger.info("Starter beregning"); + logger.info("======================================================================"); + + mainRun(consts, isIncremental, "ruteMa", max_workers, antalFundne, antalDaekkedeAdresser); + + logger.info("======================================================================"); + + mainRun(consts, true, "ruteLo", max_workers, antalFundne, antalDaekkedeAdresser); + + logger.info("======================================================================"); + + mainRun(consts, true, "ruteSo", max_workers, antalFundne, antalDaekkedeAdresser); + + logger.info("======================================================================"); - //pre-check er ok - reset tmp tabel og start søgningen + // END OF MAIN run + + threadPool.shutdown(); //Calc is done now + threadPool = null;//release early for GC + - CyclicBarrier barrier = new CyclicBarrier(max_workers + 1); + manager.submitTask( new ReloadTask("AfstandAndenRute/" + distributor) ); + - for (int i=0; i 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"); + int tmpAntalDaekkede = db.hentAlleDaekkedeAdresser(distributor); + antalDaekkedeAdresser.set(tmpAntalDaekkede); + 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() ); + + int bucketSize = 96*12; + + KdTree
addressTree = new KdTree
( 3, bucketSize ); + for(Address a: geopoints) { + addressTree.addPoint(a.xyz, a); } + + hoTrees.put(ho, addressTree); + } + + db.resetResultTable(); + - - - } /*else { - /// Test - - db.resetResultTable(); - - - 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 ; - long elapsedBeregn = now - beregnStart; - - - logger.info("Fuld load done : " + formatMilliSeconds(elapsed) ); - logger.info("Fuld load done (beregning) : " + formatMilliSeconds(elapsedBeregn) ); - logger.info("Antal daekkede : " + antalDaekkedeAdresser ); - logger.info("Antal ikke-daekkede : " + antalIkkeDaekkede ); - logger.info("Heraf, antal fundne : " + antalFundne ); - - logger.info( String.format("Fandt adresser til : %.2f %%", (antalFundne.get() *100.0)/antalIkkeDaekkede ) ); - //logger.info("Fandt adresser til : " + (antalFundne*100.0)/ikkeDaekkede.length + "%" ); + logger.info("Starter beregning"); + + //pre-check er ok - reset tmp tabel og start søgningen + + CyclicBarrier barrier = new CyclicBarrier(max_workers + 1); + + for (int i=0; i