--- dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/AfstandAndenRuteTask.java 2016/01/30 14:05:53 2878 +++ dao/DaoAdresseVedligehold/src/main/java/dk/daoas/adressevedligehold/afstandandenrute/AfstandAndenRuteTask.java 2016/03/29 19:49:38 2993 @@ -1,7 +1,5 @@ package dk.daoas.adressevedligehold.afstandandenrute; -import java.io.File; -import java.io.FileReader; import java.sql.Connection; import java.util.HashMap; import java.util.List; @@ -9,59 +7,67 @@ 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 java.util.logging.FileHandler; -import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; import ags.utils.dataStructures.trees.thirdGenKD.KdTree; +import dk.daoas.adressevedligehold.ReloadTask; import dk.daoas.adressevedligehold.ServiceConfig; import dk.daoas.adressevedligehold.beans.Address; import dk.daoas.adressevedligehold.db.DBConnection; import dk.daoas.adressevedligehold.tasks.Task; -import dk.daoas.adressevedligehold.util.HttpUtil; +import dk.daoas.adressevedligehold.tasks.TaskLogger; public class AfstandAndenRuteTask extends Task { + - final Logger logger = Logger.getLogger( AfstandAndenRuteTask.class.toString() ); + private TaskLogger logger = TaskLogger.getInstance(); - final boolean verbose = false;// + 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 = 0; + + AtomicInteger antalBeregnet = new AtomicInteger(); - ThreadPoolExecutor threadPool; + ExecutorService threadPool; + boolean isIncremental; - public AfstandAndenRuteTask(String distributor) { + public AfstandAndenRuteTask(String distributor, String type) { this.distributor = distributor; + + type = type.toUpperCase(); + switch(type) { + case FULL: + isIncremental = false; + break; + case INCREMENTAL: + isIncremental = true; + break; + default: + throw new RuntimeException("Unknown type" + type); + } } @Override protected void taskRun() 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 ); - - + Constants.init(distributor); Constants consts = Constants.getInstance(); @@ -80,130 +86,141 @@ } logger.info("Starting with MAX_WORKERS:" + max_workers); setupThreadPool(max_workers); + + logger.info("Starting with INCREMENTAL:" + isIncremental); - int antalIkkeDaekkede = -1; - - try (Connection conn = DBConnection.getConnection() ) { - Database db = new Database(conn); - - 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() ); + AtomicInteger antalFundne = new AtomicInteger(0); - int bucketSize = 96*12; + long start = System.currentTimeMillis(); + AtomicInteger antalDaekkedeAdresser = new AtomicInteger(-1); - KdTree
addressTree = new KdTree
( 3, bucketSize ); - for(Address a: geopoints) { - addressTree.addPoint(a.xyz, a); - } - 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 + - 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(); + + + 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