def _copy( self, options: Namespace, gene: TileGeneration, layer_name: str, source: str, dest: str, task_name: str, ) -> None: # disable metatiles assert gene.config_file config = gene.get_config(gene.config_file) layer = config.config["layers"][layer_name] cast(tilecloud_chain.configuration.LayerWms, layer)["meta"] = False count_tiles_dropped = Count() gene.create_log_tiles_error(layer_name) source_tilestore = gene.get_tilesstore(source) dest_tilestore = gene.get_tilesstore(dest) gene.init_tilecoords(config, layer_name) gene.add_geom_filter() gene.add_logger() gene.get(source_tilestore, "Get the tiles") gene.imap(DropEmpty(gene)) # Discard tiles with certain content if "empty_tile_detection" in layer: empty_tile = layer["empty_tile_detection"] gene.imap( HashDropper(empty_tile["size"], empty_tile["hash"], store=dest_tilestore, count=count_tiles_dropped)) if options.process: gene.process(options.process) gene.imap(DropEmpty(gene)) self.count = gene.counter_size() gene.put(dest_tilestore, "Store the tiles") gene.consume() if not options.quiet: print(f"""The tile {task_name} of layer '{layer_name}' is finish Nb {task_name} tiles: {self.count.nb} Nb errored tiles: {gene.error} Nb dropped tiles: {count_tiles_dropped.nb} Total time: {duration_format(gene.duration)} Total size: {size_format(self.count.size)} Time per tile: {(gene.duration / self.count.nb * 1000).seconds if self.count.nb != 0 else 0} ms Size per tile: {self.count.size / self.count.nb if self.count.nb != 0 else -1} o """)
def main() -> None: """Calculate the cost, main function.""" try: parser = ArgumentParser( description="Used to calculate the generation cost", prog=sys.argv[0]) add_common_options(parser, tile_pyramid=False, dimensions=True) parser.add_argument( "--cost-algo", "--calculate-cost-algorithm", default="area", dest="cost_algo", choices=("area", "count"), help= "The algorithm use to calculate the cost default base on the 'area' " "of the generation geometry, can also be 'count', to be base on number of tiles to generate.", ) options = parser.parse_args() gene = TileGeneration( options.config, options=options, layer_name=options.layer, base_config={"cost": {}}, multi_thread=False, ) config = gene.get_config(options.config) all_size: float = 0 tile_size: float = 0 all_tiles = 0 if options.layer: layer = config.config["layers"][options.layer] (all_size, all_time, all_price, all_tiles) = _calculate_cost(gene, options.layer, options) tile_size = layer["cost"]["tile_size"] / (1024.0 * 1024) else: all_time = timedelta() all_price = 0 for layer_name in gene.get_config( options.config).config["generation"]["default_layers"]: print() print(f"===== {layer_name} =====") layer = config.config["layers"][layer_name] gene.create_log_tiles_error(layer_name) (size, time, price, tiles) = _calculate_cost(gene, layer_name, options) tile_size += layer["cost"]["tile_size"] / (1024.0 * 1024) all_time += time all_price += price all_size += size all_tiles += tiles print() print("===== GLOBAL =====") print(f"Total number of tiles: {all_tiles}") print( f"Total generation time: {duration_format(all_time)} [d h:mm:ss]" ) print(f"Total generation cost: {all_price:0.2f} [$]") print() s3_cost = all_size * gene.get_main_config( ).config["cost"]["s3"]["storage"] / (1024.0 * 1024 * 1024) print(f"S3 Storage: {s3_cost:0.2f} [$/month]") s3_get_cost = ( gene.get_main_config().config["cost"]["s3"]["get"] * config.config["cost"]["request_per_layers"] / 10000.0 + gene.get_main_config().config["cost"]["s3"]["download"] * config.config["cost"]["request_per_layers"] * tile_size) print(f"S3 get: {s3_get_cost:0.2f} [$/month]") # if 'cloudfront' in gene.config['cost']: # print('CloudFront: %0.2f [$/month]' % () # gene.config['cost']['cloudfront']['get'] * # gene.config['cost']['request_per_layers'] / 10000.0 + # gene.config['cost']['cloudfront']['download'] * # gene.config['cost']['request_per_layers'] * tile_size) except SystemExit: raise except: # pylint: disable=bare-except logger.exception("Exit with exception") sys.exit(1)