Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cheap isFill check and add --skip-filled-tiles option #234

Merged
merged 7 commits into from
Jun 4, 2022

Conversation

msbarry
Copy link
Contributor

@msbarry msbarry commented May 27, 2022

Implement a cheap isFill() check for whether an encoded vector geometry only contains fill polygons and expose --skip-filled-tiles command line option that you can use to omit those from the output (for example if your client over-zooms parent tiles in this case).

Also switch to use isFill instead of the feature count heuristic to decide whether to compute a tile hash in --compact-db mode (#219). This will be useful as part of pmtiles writer #98 to decide which tiles to attempt to deduplicate.

Fixes #168

@msbarry msbarry changed the title Add --skip-filled-tiles option Cheap isFill check and add --skip-filled-tiles option May 27, 2022
@msbarry
Copy link
Contributor Author

msbarry commented May 27, 2022

Testing on the planet:

0:27:21 INF -   mbtiles          6m18s cpu:5h24m14s gc:27s avg:51.5
0:27:21 INF -     read    2x(52% 3m16s sys:50s wait:29s done:2s)
0:27:21 INF -     merge   1x(78% 4m55s sys:8s wait:45s)
0:27:21 INF -     encode 62x(74% 4m39s sys:6s wait:1m11s)
0:27:21 INF -     write   1x(67% 4m12s sys:1m2s wait:1m30s)
0:27:21 INF - ----------------------------------------
0:27:21 INF -   features        183GB
0:27:21 INF -   mbtiles 75GB

@github-actions
Copy link

github-actions bot commented May 27, 2022

Base b0f634b This Branch 09b71b8
0:02:02 DEB [mbtiles] - Tile stats:
0:02:02 DEB [mbtiles] - z0 avg:7.9k max:7.9k
0:02:02 DEB [mbtiles] - z1 avg:4k max:4k
0:02:02 DEB [mbtiles] - z2 avg:9.4k max:9.4k
0:02:02 DEB [mbtiles] - z3 avg:3.9k max:6.4k
0:02:02 DEB [mbtiles] - z4 avg:1.6k max:4.6k
0:02:02 DEB [mbtiles] - z5 avg:1.4k max:8.1k
0:02:02 DEB [mbtiles] - z6 avg:973 max:22k
0:02:02 DEB [mbtiles] - z7 avg:751 max:55k
0:02:02 DEB [mbtiles] - z8 avg:394 max:112k
0:02:02 DEB [mbtiles] - z9 avg:269 max:278k
0:02:02 DEB [mbtiles] - z10 avg:154 max:233k
0:02:02 DEB [mbtiles] - z11 avg:102 max:132k
0:02:02 DEB [mbtiles] - z12 avg:83 max:119k
0:02:02 DEB [mbtiles] - z13 avg:71 max:109k
0:02:02 DEB [mbtiles] - z14 avg:67 max:257k
0:02:02 DEB [mbtiles] - all avg:69 max:0
0:02:02 DEB [mbtiles] -  # features: 5,290,478
0:02:02 DEB [mbtiles] -     # tiles: 4,115,450
0:02:02 INF [mbtiles] - Finished in 30s cpu:59s avg:1.9
0:02:02 INF [mbtiles] -   read    1x(2% 0.7s wait:29s)
0:02:02 INF [mbtiles] -   encode  2x(57% 17s wait:3s)
0:02:02 INF [mbtiles] -   write   1x(26% 8s wait:20s)
0:02:02 INF - Finished in 2m2s cpu:3m42s gc:4s avg:1.8
0:02:02 INF - FINISHED!
0:02:02 INF - 
0:02:02 INF - ----------------------------------------
0:02:02 INF - 	overall          2m2s cpu:3m42s gc:4s avg:1.8
0:02:02 INF - 	lake_centerlines 2s cpu:4s avg:1.8
0:02:02 INF - 	  read     1x(81% 2s)
0:02:02 INF - 	  process  2x(13% 0.3s wait:2s)
0:02:02 INF - 	  write    1x(0% 0s wait:2s)
0:02:02 INF - 	water_polygons   28s cpu:50s gc:2s avg:1.8
0:02:02 INF - 	  read     1x(59% 17s sys:1s wait:3s)
0:02:02 INF - 	  process  2x(28% 8s wait:13s)
0:02:02 INF - 	  write    1x(2% 0.6s wait:28s)
0:02:02 INF - 	natural_earth    11s cpu:17s avg:1.5
0:02:02 INF - 	  read     1x(88% 10s sys:1s)
0:02:02 INF - 	  process  2x(18% 2s wait:9s)
0:02:02 INF - 	  write    1x(0% 0s wait:10s)
0:02:02 INF - 	osm_pass1        4s cpu:7s avg:1.8
0:02:02 INF - 	  read     1x(3% 0.1s wait:4s)
0:02:02 INF - 	  parse    1x(63% 3s wait:1s)
0:02:02 INF - 	  process  1x(48% 2s wait:2s)
0:02:02 INF - 	osm_pass2        36s cpu:1m11s avg:2
0:02:02 INF - 	  read     1x(0% 0.1s wait:19s done:16s)
0:02:02 INF - 	  process  2x(75% 27s)
0:02:02 INF - 	  write    1x(1% 0.4s wait:35s)
0:02:02 INF - 	boundaries       0s cpu:0.1s avg:1.8
0:02:02 INF - 	sort             3s cpu:4s avg:1.6
0:02:02 INF - 	  worker  1x(76% 2s)
0:02:02 INF - 	mbtiles          30s cpu:59s avg:1.9
0:02:02 INF - 	  read    1x(2% 0.7s wait:29s)
0:02:02 INF - 	  encode  2x(57% 17s wait:3s)
0:02:02 INF - 	  write   1x(26% 8s wait:20s)
0:02:02 INF - ----------------------------------------
0:02:02 INF - 	features	270MB
0:02:02 INF - 	mbtiles	108MB
-rw-r--r-- 1 runner docker 55M Jun  4 00:54 run.jar
0:02:00 DEB [mbtiles] - Tile stats:
0:02:00 DEB [mbtiles] - z0 avg:7.9k max:7.9k
0:02:00 DEB [mbtiles] - z1 avg:4k max:4k
0:02:00 DEB [mbtiles] - z2 avg:9.4k max:9.4k
0:02:00 DEB [mbtiles] - z3 avg:3.9k max:6.4k
0:02:00 DEB [mbtiles] - z4 avg:1.6k max:4.6k
0:02:00 DEB [mbtiles] - z5 avg:1.4k max:8.1k
0:02:00 DEB [mbtiles] - z6 avg:973 max:22k
0:02:00 DEB [mbtiles] - z7 avg:751 max:55k
0:02:00 DEB [mbtiles] - z8 avg:394 max:112k
0:02:00 DEB [mbtiles] - z9 avg:269 max:278k
0:02:00 DEB [mbtiles] - z10 avg:154 max:233k
0:02:00 DEB [mbtiles] - z11 avg:102 max:132k
0:02:00 DEB [mbtiles] - z12 avg:83 max:119k
0:02:00 DEB [mbtiles] - z13 avg:71 max:109k
0:02:00 DEB [mbtiles] - z14 avg:67 max:257k
0:02:00 DEB [mbtiles] - all avg:69 max:0
0:02:00 DEB [mbtiles] -  # features: 5,290,478
0:02:00 DEB [mbtiles] -     # tiles: 4,115,450
0:02:00 INF [mbtiles] - Finished in 32s cpu:1m2s gc:1s avg:1.9
0:02:00 INF [mbtiles] -   read    1x(2% 0.7s wait:30s)
0:02:00 INF [mbtiles] -   encode  2x(58% 18s wait:3s)
0:02:00 INF [mbtiles] -   write   1x(25% 8s wait:21s)
0:02:00 INF - Finished in 2m cpu:3m34s gc:4s avg:1.8
0:02:00 INF - FINISHED!
0:02:00 INF - 
0:02:00 INF - ----------------------------------------
0:02:00 INF - 	overall          2m cpu:3m34s gc:4s avg:1.8
0:02:00 INF - 	lake_centerlines 2s cpu:4s avg:1.8
0:02:00 INF - 	  read     1x(84% 2s)
0:02:00 INF - 	  process  2x(14% 0.3s wait:2s)
0:02:00 INF - 	  write    1x(0% 0s wait:2s)
0:02:00 INF - 	water_polygons   27s cpu:47s gc:2s avg:1.8
0:02:00 INF - 	  read     1x(60% 16s wait:3s)
0:02:00 INF - 	  process  2x(28% 8s wait:12s)
0:02:00 INF - 	  write    1x(2% 0.6s wait:26s)
0:02:00 INF - 	natural_earth    10s cpu:17s avg:1.6
0:02:00 INF - 	  read     1x(90% 9s sys:2s)
0:02:00 INF - 	  process  2x(18% 2s wait:9s)
0:02:00 INF - 	  write    1x(0% 0s wait:10s)
0:02:00 INF - 	osm_pass1        3s cpu:6s avg:1.8
0:02:00 INF - 	  read     1x(4% 0.1s wait:3s)
0:02:00 INF - 	  parse    1x(69% 2s)
0:02:00 INF - 	  process  1x(42% 1s wait:2s)
0:02:00 INF - 	osm_pass2        33s cpu:1m5s avg:2
0:02:00 INF - 	  read     1x(0% 0s wait:16s done:16s)
0:02:00 INF - 	  process  2x(77% 25s)
0:02:00 INF - 	  write    1x(1% 0.4s wait:32s)
0:02:00 INF - 	boundaries       0s cpu:0.1s avg:1.7
0:02:00 INF - 	sort             2s cpu:3s avg:1.4
0:02:00 INF - 	  worker  1x(86% 2s)
0:02:00 INF - 	mbtiles          32s cpu:1m2s gc:1s avg:1.9
0:02:00 INF - 	  read    1x(2% 0.7s wait:30s)
0:02:00 INF - 	  encode  2x(58% 18s wait:3s)
0:02:00 INF - 	  write   1x(25% 8s wait:21s)
0:02:00 INF - ----------------------------------------
0:02:00 INF - 	features	270MB
0:02:00 INF - 	mbtiles	108MB
-rw-r--r-- 1 runner docker 55M Jun  4 00:52 run.jar

https://github.com/onthegomap/planetiler/actions/runs/2437903128

ℹ️ Base Logs b0f634b
0:00:00 DEB - argument: config=null (path to config file)
0:00:00 DEB - argument: area=rhode island (name of the extract to download if osm_url/osm_path not specified (i.e. 'monaco' 'rhode island' 'australia' or 'planet'))
0:00:00 INF - Using in-memory stats
0:00:00 INF [overall] - 
0:00:00 INF [overall] - Starting...
0:00:00 DEB - argument: madvise=true (default value for whether to use linux madvise(random) to improve memory-mapped read performance for temporary storage)
0:00:00 DEB - argument: storage=mmap (default storage type for temporary data, one of [ram, mmap, direct])
0:00:00 DEB - argument: threads=2 (num threads)
0:00:00 DEB - argument: write_threads=1 (number of threads to use when writing temp features)
0:00:00 DEB - argument: process_threads=2 (number of threads to use when processing input features)
0:00:00 DEB - argument: bounds=Env[-74.07 : -17.84, 21.34 : 43.55] (bounds)
0:00:00 DEB - argument: feature_read_threads=1 (number of threads to use when reading features at tile write time)
0:00:00 DEB - argument: loginterval=10 seconds (time between logs)
0:00:00 DEB - argument: minzoom=0 (minimum zoom level)
0:00:00 DEB - argument: maxzoom=14 (maximum zoom level (limit 14))
0:00:00 DEB - argument: skip_mbtiles_index_creation=false (skip adding index to mbtiles file)
0:00:00 DEB - argument: optimize_db=false (optimize mbtiles after writing)
0:00:00 DEB - argument: emit_tiles_in_order=true (emit tiles in index order)
0:00:00 DEB - argument: force=false (overwriting output file and ignore disk/RAM warnings)
0:00:00 DEB - argument: gzip_temp=false (gzip temporary feature storage (uses more CPU, but less disk space))
0:00:00 DEB - argument: mmap_temp=true (use memory-mapped IO for temp feature files)
0:00:00 DEB - argument: sort_max_readers=6 (maximum number of concurrent read threads to use when sorting chunks)
0:00:00 DEB - argument: sort_max_writers=6 (maximum number of concurrent write threads to use when sorting chunks)
0:00:00 DEB - argument: nodemap_type=sparsearray (type of node location map, one of [noop, sortedtable, sparsearray, array])
0:00:00 DEB - argument: nodemap_storage=mmap (storage for node location map, one of [ram, mmap, direct])
0:00:00 DEB - argument: nodemap_madvise=true (use linux madvise(random) for node locations)
0:00:00 DEB - argument: multipolygon_geometry_storage=mmap (storage for multipolygon geometries, one of [ram, mmap, direct])
0:00:00 DEB - argument: multipolygon_geometry_madvise=true (use linux madvise(random) for temporary multipolygon geometry storage)
0:00:00 DEB - argument: http_user_agent=Planetiler downloader (https://github.com/onthegomap/planetiler) (User-Agent header to set when downloading files over HTTP)
0:00:00 DEB - argument: http_timeout=30 seconds (Timeout to use when downloading files over HTTP)
0:00:00 DEB - argument: http_retries=1 (Retries to use when downloading files over HTTP)
0:00:00 DEB - argument: download_chunk_size_mb=100 (Size of file chunks to download in parallel in megabytes)
0:00:00 DEB - argument: download_threads=1 (Number of parallel threads to use when downloading each file)
0:00:00 DEB - argument: min_feature_size_at_max_zoom=0.0625 (Default value for the minimum size in tile pixels of features to emit at the maximum zoom level to allow for overzooming)
0:00:00 DEB - argument: min_feature_size=1.0 (Default value for the minimum size in tile pixels of features to emit below the maximum zoom level)
0:00:00 DEB - argument: simplify_tolerance_at_max_zoom=0.0625 (Default value for the tile pixel tolerance to use when simplifying features at the maximum zoom level to allow for overzooming)
0:00:00 DEB - argument: simplify_tolerance=0.1 (Default value for the tile pixel tolerance to use when simplifying features below the maximum zoom level)
0:00:00 DEB - argument: osm_lazy_reads=false (Read OSM blocks from disk in worker threads)
0:00:00 DEB - argument: compact_db=true (Reduce the DB size by separating and deduping the tile data)
0:00:00 DEB - argument: tmpdir=data/tmp (temp directory)
0:00:00 DEB - argument: only_download=false (download source data then exit)
0:00:00 DEB - argument: download=false (download sources)
0:00:00 DEB - argument: temp_nodes=data/tmp/node.db (temp node db location)
0:00:00 DEB - argument: temp_multipolygons=data/tmp/multipolygon.db (temp multipolygon db location)
0:00:00 DEB - argument: temp_features=data/tmp/feature.db (temp feature db location)
0:00:00 DEB - argument: osm_parse_node_bounds=false (parse bounds from OSM nodes instead of header)
0:00:00 DEB - argument: only_fetch_wikidata=false (fetch wikidata translations then quit)
0:00:00 DEB - argument: fetch_wikidata=false (fetch wikidata translations then continue)
0:00:00 DEB - argument: use_wikidata=true (use wikidata translations)
0:00:00 DEB - argument: wikidata_cache=data/sources/wikidata_names.json (wikidata cache file)
0:00:00 DEB - argument: lake_centerlines_path=data/sources/lake_centerline.shp.zip (lake_centerlines shapefile path)
0:00:00 DEB - argument: free_lake_centerlines_after_read=false (delete lake_centerlines input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: water_polygons_path=data/sources/water-polygons-split-3857.zip (water_polygons shapefile path)
0:00:00 DEB - argument: free_water_polygons_after_read=false (delete water_polygons input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: natural_earth_path=data/sources/natural_earth_vector.sqlite.zip (natural_earth sqlite db path)
0:00:00 DEB - argument: free_natural_earth_after_read=false (delete natural_earth input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: osm_path=data/sources/rhode_island.osm.pbf (osm OSM input file path)
0:00:00 DEB - argument: free_osm_after_read=false (delete osm input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: mbtiles=data/out.mbtiles (mbtiles output file)
0:00:00 DEB - argument: transliterate=true (attempt to transliterate latin names)
0:00:00 DEB - argument: languages=am,ar,az,be,bg,br,bs,ca,co,cs,cy,da,de,el,en,eo,es,et,eu,fi,fr,fy,ga,gd,he,hi,hr,hu,hy,id,is,it,ja,ja_kana,ja_rm,ja-Latn,ja-Hira,ka,kk,kn,ko,ko-Latn,ku,la,lb,lt,lv,mk,mt,ml,nl,no,oc,pl,pt,rm,ro,ru,sk,sl,sq,sr,sr-Latn,sv,ta,te,th,tr,uk,zh (languages to use)
0:00:00 DEB - argument: only_layers= (Include only certain layers)
0:00:00 DEB - argument: exclude_layers= (Exclude certain layers)
0:00:00 DEB - argument: boundary_country_names=true (boundary layer: add left/right codes of neighboring countries)
0:00:00 DEB - argument: transportation_z13_paths=false (transportation(_name) layer: show all paths on z13)
0:00:00 DEB - argument: building_merge_z13=true (building layer: merge nearby buildings at z13)
0:00:00 DEB - argument: transportation_name_brunnel=false (transportation_name layer: set to false to omit brunnel and help merge long highways)
0:00:00 DEB - argument: transportation_name_size_for_shield=false (transportation_name layer: allow road names on shorter segments (ie. they will have a shield))
0:00:00 DEB - argument: transportation_name_limit_merge=false (transportation_name layer: limit merge so we don't combine different relations to help merge long highways)
0:00:00 DEB - argument: transportation_name_minor_refs=false (transportation_name layer: include name and refs from minor road networks if not present on a way)
0:00:00 DEB - argument: mbtiles_name=OpenMapTiles ('name' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org ('description' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_attribution=<a href="https://www.openmaptiles.org/" target="_blank">&copy; OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a> ('attribution' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_version=3.13.1 ('version' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_type=baselayer ('type' attribute for mbtiles metadata)
0:00:00 DEB - argument: help=false (show arguments then exit)
0:00:00 INF - Building BasemapProfile profile into data/out.mbtiles in these phases:
0:00:00 INF -   lake_centerlines: Process features in data/sources/lake_centerline.shp.zip
0:00:00 INF -   water_polygons: Process features in data/sources/water-polygons-split-3857.zip
0:00:00 INF -   natural_earth: Process features in data/sources/natural_earth_vector.sqlite.zip
0:00:00 INF -   osm_pass1: Pre-process OpenStreetMap input (store node locations then relation members)
0:00:00 INF -   osm_pass2: Process OpenStreetMap nodes, ways, then relations
0:00:00 INF -   sort: Sort rendered features by tile ID
0:00:00 INF -   mbtiles: Encode each tile and write to data/out.mbtiles
0:00:00 INF - no wikidata translations found, run with --fetch-wikidata to download
0:00:00 DEB - ✓ 194M storage on / (/dev/root) requested for read phase disk, 29G available
0:00:00 DEB -  - 43M used for temporary node location cache
0:00:00 DEB -  - 6.6M used for temporary multipolygon geometry cache
0:00:00 DEB -  - 144M used for temporary feature storage
0:00:00 DEB - ✓ 216M storage on / (/dev/root) requested for write phase disk, 29G available
0:00:00 DEB -  - 144M used for temporary feature storage
0:00:00 DEB -  - 72M used for mbtiles output
0:00:00 DEB - ✓ 312M JVM heap requested for read phase, 4.2G available
0:00:00 DEB -  - 300M used for sparsearray node location in-memory index
0:00:00 DEB -  - 12M used for temporary profile storage
0:00:00 DEB - ✓ 50M storage on / (/dev/root) requested for read phase, 29G available
0:00:00 DEB -  - 43M used for sparsearray node location cache
0:00:00 DEB -  - 6.6M used for multipolygon way geometries
0:00:00 DEB - ✓ 50M temporary files and 2.9G of free memory for OS to cache them
0:00:00 INF - Using merge sort feature map, chunk size=1431mb max workers=2
0:00:01 INF - dataFileCache open start
0:00:02 INF [lake_centerlines] - 
0:00:02 INF [lake_centerlines] - Starting...
0:00:04 INF [lake_centerlines] -  read: [  59k 100%  25k/s ] write: [    0    0/s ] 0    
    cpus: 1.8 gc:  4% heap: 155M/4.2G direct: 237k postGC: 74M
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:00:04 INF [lake_centerlines] - Finished in 2s cpu:4s avg:1.8
0:00:04 INF [lake_centerlines] -   read     1x(81% 2s)
0:00:04 INF [lake_centerlines] -   process  2x(13% 0.3s wait:2s)
0:00:04 INF [lake_centerlines] -   write    1x(0% 0s wait:2s)
0:00:04 INF [water_polygons] - 
0:00:04 INF [water_polygons] - Starting...
0:00:14 INF [water_polygons] -  read: [ 1.8k  13%  186/s ] write: [  47k 4.6k/s ] 1.4G 
    cpus: 2 gc: 11% heap: 1.1G/4.2G direct: 52M postGC: 1G
    read(57%) ->   (33/1k) -> process(44% 13%) -> (438/53k) -> write( 0%)
0:00:24 INF [water_polygons] -  read: [ 4.6k  32%  275/s ] write: [ 233k  18k/s ] 1.4G 
    cpus: 1.7 gc:  7% heap: 3.2G/4.2G direct: 52M postGC: 1.5G
    read(66%) ->    (0/1k) -> process(26% 28%) -> (1.3k/53k) -> write( 0%)
0:00:32 INF [water_polygons] -  read: [  14k 100% 1.2k/s ] write: [ 4.3M 498k/s ] 186M 
    cpus: 1.6 gc:  7% heap: 1.7G/4.2G direct: 52M postGC: 1.8G
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( 7%)
0:00:32 INF [water_polygons] - Finished in 28s cpu:50s gc:2s avg:1.8
0:00:32 INF [water_polygons] -   read     1x(59% 17s sys:1s wait:3s)
0:00:32 INF [water_polygons] -   process  2x(28% 8s wait:13s)
0:00:32 INF [water_polygons] -   write    1x(2% 0.6s wait:28s)
0:00:32 INF [natural_earth] - unzipping /home/runner/work/planetiler/planetiler/data/sources/natural_earth_vector.sqlite.zip to data/tmp/natearth.sqlite
0:00:38 INF [natural_earth] - 
0:00:38 INF [natural_earth] - Starting...
0:00:49 INF [natural_earth] -  read: [ 346k  99%  34k/s ] write: [    0    0/s ] 1.6G 
    cpus: 1.6 gc:  0% heap: 1G/4.2G direct: 52M postGC: 166M
    read(95%) ->    (0/1k) -> process(18% 20%) -> (153/53k) -> write( 0%)
0:00:49 INF [natural_earth] -  read: [ 349k 100%  17k/s ] write: [  181  843/s ] 186M 
    cpus: 1.5 gc:  0% heap: 1.1G/4.2G direct: 52M postGC: 166M
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:00:49 INF [natural_earth] - Finished in 11s cpu:17s avg:1.5
0:00:49 INF [natural_earth] -   read     1x(88% 10s sys:1s)
0:00:49 INF [natural_earth] -   process  2x(18% 2s wait:9s)
0:00:49 INF [natural_earth] -   write    1x(0% 0s wait:10s)
0:00:49 INF [osm_pass1] - 
0:00:49 INF [osm_pass1] - Starting...
0:00:52 INF [osm_pass1:process] - Finished nodes: 4,592,898 (1.5M/s) in 3s cpu:5s avg:1.7
0:00:53 INF [osm_pass1:process] - Finished ways: 330,569 (374k/s) in 0.9s cpu:2s avg:2
0:00:53 INF [osm_pass1:process] - Finished relations: 7,705 (104k/s) in 0.1s cpu:0.2s avg:2.2
0:00:53 INF [osm_pass1] -  nodes: [ 4.5M 1.1M/s ] 414M  ways: [ 330k  81k/s ] rels: [ 7.7k 1.9k/s ] blocks: [  618  152/s ]
    cpus: 1.8 gc:  0% heap: 1.3G/4.2G direct: 52M postGC: 808M hppc: 879k
    read( -%) ->     (0/4) -> parse( -%) ->     (0/4) -> process( -%)
0:00:53 DEB [osm_pass1] - Processed 618 blocks:
0:00:53 DEB [osm_pass1] -   nodes: 4,592,898 (1.5M/s) in 3s cpu:5s avg:1.7
0:00:53 DEB [osm_pass1] -   ways: 330,569 (374k/s) in 0.9s cpu:2s avg:2
0:00:53 DEB [osm_pass1] -   relations: 7,705 (104k/s) in 0.1s cpu:0.2s avg:2.2
0:00:53 INF [osm_pass1] - Finished in 4s cpu:7s avg:1.8
0:00:53 INF [osm_pass1] -   read     1x(3% 0.1s wait:4s)
0:00:53 INF [osm_pass1] -   parse    1x(63% 3s wait:1s)
0:00:53 INF [osm_pass1] -   process  1x(48% 2s wait:2s)
0:00:53 INF [osm_pass2] - 
0:00:53 INF [osm_pass2] - Starting...
0:00:56 DEB [osm_pass2:process] - Sorting long long multimap...
0:00:56 INF [osm_pass2:process] - Finished nodes: 4,592,898 (1.5M/s) in 3s cpu:6s avg:2
0:00:56 DEB [osm_pass2:process] - Sorted long long multimap 0s cpu:0.1s avg:2.2
0:00:56 WAR [osm_pass2:process] - No GB polygon for inferring route network types
0:01:03 INF [osm_pass2] -  nodes: [ 4.5M 100% 459k/s ] 414M  ways: [  77k  23% 7.7k/s ] rels: [    0   0%    0/s ] features: [ 4.7M  38k/s ] 1.6G  blocks: [  584  94%   58/s ]
    cpus: 2 gc:  0% heap: 2G/4.2G direct: 52M postGC: 834M relInfo: 826k mpGeoms: 424k 
    read( 0%) ->   (11/13) -> process(61% 65%) ->  (1k/53k) -> write( 2%)
0:01:13 INF [osm_pass2] -  nodes: [ 4.5M 100%    0/s ] 414M  ways: [ 256k  78%  17k/s ] rels: [    0   0%    0/s ] features: [   5M  39k/s ] 1.6G  blocks: [  606  98%    2/s ]
    cpus: 2 gc:  0% heap: 2.2G/4.2G direct: 52M postGC: 852M relInfo: 826k mpGeoms: 12M  
    read( -%) ->   (10/13) -> process(77% 79%) -> (1.6k/53k) -> write( 1%)
0:01:18 INF [osm_pass2:process] - Finished ways: 330,569 (15k/s) in 21s cpu:42s avg:2
0:01:23 INF [osm_pass2] -  nodes: [ 4.5M 100%    0/s ] 414M  ways: [ 330k 100% 7.4k/s ] rels: [   4k  52%  403/s ] features: [ 5.2M  17k/s ] 1.6G  blocks: [  617 100%    1/s ]
    cpus: 2 gc:  1% heap: 2G/4.2G direct: 52M postGC: 841M relInfo: 826k mpGeoms: 19M  
    read( -%) ->    (0/13) -> process(79% 80%) -> (1.8k/53k) -> write( 1%)
0:01:27 INF [osm_pass2:process] - Finished relations: 7,705 (845/s) in 9s cpu:18s avg:2
0:01:29 INF [osm_pass2] -  nodes: [ 4.5M 100%    0/s ] 414M  ways: [ 330k 100%    0/s ] rels: [ 7.7k 100%  642/s ] features: [ 5.2M 3.1k/s ] 269M  blocks: [  618 100%   <1/s ]
    cpus: 2 gc:  1% heap: 1G/4.2G direct: 52M postGC: 828M relInfo: 826k mpGeoms: 19M  
    read( -%) ->    (0/13) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:01:29 DEB [osm_pass2] - Processed 618 blocks:
0:01:29 DEB [osm_pass2] -   nodes: 4,592,898 (1.5M/s) in 3s cpu:6s avg:2
0:01:29 DEB [osm_pass2] -   ways: 330,569 (15k/s) in 21s cpu:42s avg:2
0:01:29 DEB [osm_pass2] -   relations: 7,705 (845/s) in 9s cpu:18s avg:2
0:01:29 INF [osm_pass2] - Finished in 36s cpu:1m11s avg:2
0:01:29 INF [osm_pass2] -   read     1x(0% 0.1s wait:19s done:16s)
0:01:29 INF [osm_pass2] -   process  2x(75% 27s)
0:01:29 INF [osm_pass2] -   write    1x(1% 0.4s wait:35s)
0:01:29 INF [boundaries] - 
0:01:29 INF [boundaries] - Starting...
0:01:29 INF [boundaries] - Creating polygons for 1 boundaries
0:01:29 WAR [boundaries] - Unable to form closed polygon for OSM relation 148838 (likely missing edges)
0:01:29 INF [boundaries] - Finished creating 0 country polygons
0:01:29 INF [boundaries] - Finished in 0s cpu:0.1s avg:1.8
0:01:29 INF - Deleting node.db to make room for output file
0:01:29 INF [sort] - 
0:01:29 INF [sort] - Starting...
0:01:29 INF [sort] - Grouped 8 chunks into 1
0:01:32 INF [sort] -  chunks: [   1 /   1 100% ] 270M 
    cpus: 1.5 gc:  0% heap: 1.5G/4.2G direct: 52M postGC: 828M
    ->     (0/3) -> worker( -%)
0:01:32 INF [sort] - Finished in 3s cpu:4s avg:1.6
0:01:32 INF [sort] -   worker  1x(76% 2s)
0:01:32 INF - read:0s write:0s sort:1s
0:01:32 INF [mbtiles] - 
0:01:32 INF [mbtiles] - Starting...
0:01:32 DEB [mbtiles:write] - Execute mbtiles: create table metadata (name text, value text);
0:01:32 DEB [mbtiles:write] - Execute mbtiles: create unique index name on metadata (name);
0:01:32 DEB [mbtiles:write] - Execute mbtiles: create table tiles_shallow (
  zoom_level integer,
  tile_column integer,
  tile_row integer,
  tile_data_id integer

  , primary key(zoom_level,tile_column,tile_row)

) without rowid

0:01:32 DEB [mbtiles:write] - Execute mbtiles: create table tiles_data (
  tile_data_id integer primary key,
  tile_data blob
)

0:01:32 DEB [mbtiles:write] - Execute mbtiles: create view tiles AS
select
  tiles_shallow.zoom_level as zoom_level,
  tiles_shallow.tile_column as tile_column,
  tiles_shallow.tile_row as tile_row,
  tiles_data.tile_data as tile_data
from tiles_shallow
join tiles_data on tiles_shallow.tile_data_id = tiles_data.tile_data_id

0:01:32 DEB [mbtiles:write] - Set mbtiles metadata: name=OpenMapTiles
0:01:32 DEB [mbtiles:write] - Set mbtiles metadata: format=pbf
0:01:32 DEB [mbtiles:write] - Set mbtiles metadata: description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org
0:01:32 DEB [mbtiles:write] - Set mbtiles metadata: attribution=<a href="https://www.openmaptiles.org/" target="_blank">&copy; OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a>
0:01:32 DEB [mbtiles:write] - Set mbtiles metadata: version=3.13.1
0:01:32 DEB [mbtiles:write] - Set mbtiles metadata: type=baselayer
0:01:32 DEB [mbtiles:write] - Set mbtiles metadata: bounds=-74.07,21.34,-17.84,43.55
0:01:32 DEB [mbtiles:write] - Set mbtiles metadata: center=-45.955,32.445,3
0:01:32 DEB [mbtiles:write] - Set mbtiles metadata: minzoom=0
0:01:32 DEB [mbtiles:write] - Set mbtiles metadata: maxzoom=14
0:01:32 DEB [mbtiles:write] - Set mbtiles metadata: json={"vector_layers":[{"id":"aerodrome_label","fields":{"name_int":"String","iata":"String","ele_ft":"Number","name_de":"String","name":"String","icao":"String","name:en":"String","class":"String","ele":"Number","name_en":"String","name:latin":"String"},"minzoom":10,"maxzoom":14},{"id":"aeroway","fields":{"ref":"String","class":"String"},"minzoom":10,"maxzoom":14},{"id":"boundary","fields":{"disputed":"Number","admin_level":"Number","maritime":"Number","disputed_name":"String"},"minzoom":0,"maxzoom":14},{"id":"building","fields":{"colour":"String","render_height":"Number","render_min_height":"Number"},"minzoom":13,"maxzoom":14},{"id":"housenumber","fields":{"housenumber":"String"},"minzoom":14,"maxzoom":14},{"id":"landcover","fields":{"subclass":"String","class":"String","_numpoints":"Number"},"minzoom":7,"maxzoom":14},{"id":"landuse","fields":{"class":"String"},"minzoom":4,"maxzoom":14},{"id":"mountain_peak","fields":{"name_int":"String","customary_ft":"Number","ele_ft":"Number","name_de":"String","name":"String","rank":"Number","class":"String","name_en":"String","name:latin":"String","ele":"Number"},"minzoom":7,"maxzoom":14},{"id":"park","fields":{"name_int":"String","name_de":"String","name":"String","name:en":"String","class":"String","name_en":"String","name:latin":"String"},"minzoom":6,"maxzoom":14},{"id":"place","fields":{"name:fy":"String","name_int":"String","capital":"Number","name:uk":"String","name:pl":"String","name:nl":"String","name:be":"String","name:ru":"String","name:ko":"String","name_de":"String","name":"String","rank":"Number","name:en":"String","name:eo":"String","class":"String","name:hu":"String","name:ta":"String","name:zh":"String","name_en":"String","name:latin":"String"},"minzoom":2,"maxzoom":14},{"id":"poi","fields":{"name_int":"String","level":"Number","name_de":"String","name":"String","subclass":"String","indoor":"Number","name:en":"String","class":"String","layer":"Number","name:zh":"String","name_en":"String","name:latin":"String"},"minzoom":12,"maxzoom":14},{"id":"transportation","fields":{"brunnel":"String","access":"String","expressway":"Number","bicycle":"String","surface":"String","level":"Number","ramp":"Number","mtb_scale":"String","toll":"Number","layer":"Number","oneway":"Number","network":"String","horse":"String","service":"String","subclass":"String","class":"String","foot":"String"},"minzoom":4,"maxzoom":14},{"id":"transportation_name","fields":{"name_int":"String","route_4":"String","route_3":"String","route_2":"String","route_1":"String","layer":"Number","network":"String","ref":"String","name_de":"String","name":"String","subclass":"String","ref_length":"Number","class":"String","name_en":"String","name:latin":"String"},"minzoom":6,"maxzoom":14},{"id":"water","fields":{"intermittent":"Number","id":"Number","class":"String"},"minzoom":0,"maxzoom":14},{"id":"water_name","fields":{"name_int":"String","name_de":"String","name":"String","intermittent":"Number","class":"String","name_en":"String","name:latin":"String"},"minzoom":9,"maxzoom":14},{"id":"waterway","fields":{"name_int":"String","brunnel":"String","name_de":"String","_relid":"Number","intermittent":"Number","name":"String","class":"String","name:latin":"String","name_en":"String"},"minzoom":4,"maxzoom":14}]}
0:01:34 INF [mbtiles:write] - Starting z0
0:01:34 INF [mbtiles:write] - Finished z0 in 0s cpu:0s avg:0, now starting z1
0:01:34 INF [mbtiles:write] - Finished z1 in 0s cpu:0s avg:0, now starting z2
0:01:34 INF [mbtiles:write] - Finished z2 in 0s cpu:0s avg:0, now starting z3
0:01:34 INF [mbtiles:write] - Finished z3 in 0s cpu:0s avg:0, now starting z4
0:01:34 INF [mbtiles:write] - Finished z4 in 0s cpu:0s avg:0, now starting z5
0:01:34 INF [mbtiles:write] - Finished z5 in 0s cpu:0s avg:0, now starting z6
0:01:34 INF [mbtiles:write] - Finished z6 in 0s cpu:0s avg:0, now starting z7
0:01:34 INF [mbtiles:write] - Finished z7 in 0.5s cpu:1s avg:2, now starting z8
0:01:36 INF [mbtiles:write] - Finished z8 in 1s cpu:3s avg:2, now starting z9
0:01:36 INF [mbtiles:write] - Finished z9 in 0.8s cpu:2s avg:2, now starting z10
0:01:37 INF [mbtiles:write] - Finished z10 in 1s cpu:2s avg:1.9, now starting z11
0:01:39 INF [mbtiles:write] - Finished z11 in 1s cpu:3s avg:2, now starting z12
0:01:42 INF [mbtiles] -  features: [ 476k   9%  47k/s ] 270M  tiles: [ 248k  24k/s ] 12M  
    cpus: 2 gc:  4% heap: 865M/4.2G direct: 52M postGC: 844M
    read( 1%) -> (213/217) -> encode(57% 58%) -> (215/216) -> write( 6%)
    last tile: 12/1811/1576 (z12 94%) https://www.openstreetmap.org/#map=12/38.27269/-20.83008
0:01:42 INF [mbtiles:write] - Finished z12 in 3s cpu:6s avg:2, now starting z13
0:01:52 INF [mbtiles] -  features: [ 836k  16%  35k/s ] 270M  tiles: [ 294k 4.5k/s ] 13M  
    cpus: 2 gc:  1% heap: 1.6G/4.2G direct: 52M postGC: 879M
    read( 0%) -> (214/217) -> encode(64% 64%) -> (215/216) -> write( 1%)
    last tile: 13/2475/3052 (z13 5%) https://www.openstreetmap.org/#map=13/41.64008/-71.23535
0:01:55 INF [mbtiles:write] - Finished z13 in 13s cpu:25s avg:2, now starting z14
0:02:02 INF [mbtiles] -  features: [ 5.2M 100% 445k/s ] 270M  tiles: [   4M 371k/s ] 106M 
    cpus: 1.9 gc:  2% heap: 1.1G/4.2G direct: 52M postGC: 906M
    read( -%) ->   (0/217) -> encode( -%  -%) -> (106/216) -> write(69%)
    last tile: 14/7293/6791 (z14 96%) https://www.openstreetmap.org/#map=14/29.40132/-19.75342
0:02:02 DEB [mbtiles:write] - Shallow tiles written: 4,115,450
0:02:02 DEB [mbtiles:write] - Tile data written: 21,432 (99% omitted)
0:02:02 DEB [mbtiles:write] - Unique tile hashes: 19,054
0:02:02 INF [mbtiles:write] - Finished z14 in 8s cpu:14s avg:1.8
0:02:02 INF [mbtiles] -  features: [ 5.2M 100%    0/s ] 270M  tiles: [ 4.1M 539k/s ] 108M 
    cpus: 1 gc:  0% heap: 1.1G/4.2G direct: 52M postGC: 906M
    read( -%) ->   (0/217) -> encode( -%  -%) ->   (0/216) -> write( -%)
    last tile: 14/7380/5985 (z14 100%) https://www.openstreetmap.org/#map=14/43.56447/-17.84180
0:02:02 DEB [mbtiles] - Tile stats:
0:02:02 DEB [mbtiles] - z0 avg:7.9k max:7.9k
0:02:02 DEB [mbtiles] - z1 avg:4k max:4k
0:02:02 DEB [mbtiles] - z2 avg:9.4k max:9.4k
0:02:02 DEB [mbtiles] - z3 avg:3.9k max:6.4k
0:02:02 DEB [mbtiles] - z4 avg:1.6k max:4.6k
0:02:02 DEB [mbtiles] - z5 avg:1.4k max:8.1k
0:02:02 DEB [mbtiles] - z6 avg:973 max:22k
0:02:02 DEB [mbtiles] - z7 avg:751 max:55k
0:02:02 DEB [mbtiles] - z8 avg:394 max:112k
0:02:02 DEB [mbtiles] - z9 avg:269 max:278k
0:02:02 DEB [mbtiles] - z10 avg:154 max:233k
0:02:02 DEB [mbtiles] - z11 avg:102 max:132k
0:02:02 DEB [mbtiles] - z12 avg:83 max:119k
0:02:02 DEB [mbtiles] - z13 avg:71 max:109k
0:02:02 DEB [mbtiles] - z14 avg:67 max:257k
0:02:02 DEB [mbtiles] - all avg:69 max:0
0:02:02 DEB [mbtiles] -  # features: 5,290,478
0:02:02 DEB [mbtiles] -     # tiles: 4,115,450
0:02:02 INF [mbtiles] - Finished in 30s cpu:59s avg:1.9
0:02:02 INF [mbtiles] -   read    1x(2% 0.7s wait:29s)
0:02:02 INF [mbtiles] -   encode  2x(57% 17s wait:3s)
0:02:02 INF [mbtiles] -   write   1x(26% 8s wait:20s)
0:02:02 INF - Finished in 2m2s cpu:3m42s gc:4s avg:1.8
0:02:02 INF - FINISHED!
0:02:02 INF - 
0:02:02 INF - ----------------------------------------
0:02:02 INF - 	overall          2m2s cpu:3m42s gc:4s avg:1.8
0:02:02 INF - 	lake_centerlines 2s cpu:4s avg:1.8
0:02:02 INF - 	  read     1x(81% 2s)
0:02:02 INF - 	  process  2x(13% 0.3s wait:2s)
0:02:02 INF - 	  write    1x(0% 0s wait:2s)
0:02:02 INF - 	water_polygons   28s cpu:50s gc:2s avg:1.8
0:02:02 INF - 	  read     1x(59% 17s sys:1s wait:3s)
0:02:02 INF - 	  process  2x(28% 8s wait:13s)
0:02:02 INF - 	  write    1x(2% 0.6s wait:28s)
0:02:02 INF - 	natural_earth    11s cpu:17s avg:1.5
0:02:02 INF - 	  read     1x(88% 10s sys:1s)
0:02:02 INF - 	  process  2x(18% 2s wait:9s)
0:02:02 INF - 	  write    1x(0% 0s wait:10s)
0:02:02 INF - 	osm_pass1        4s cpu:7s avg:1.8
0:02:02 INF - 	  read     1x(3% 0.1s wait:4s)
0:02:02 INF - 	  parse    1x(63% 3s wait:1s)
0:02:02 INF - 	  process  1x(48% 2s wait:2s)
0:02:02 INF - 	osm_pass2        36s cpu:1m11s avg:2
0:02:02 INF - 	  read     1x(0% 0.1s wait:19s done:16s)
0:02:02 INF - 	  process  2x(75% 27s)
0:02:02 INF - 	  write    1x(1% 0.4s wait:35s)
0:02:02 INF - 	boundaries       0s cpu:0.1s avg:1.8
0:02:02 INF - 	sort             3s cpu:4s avg:1.6
0:02:02 INF - 	  worker  1x(76% 2s)
0:02:02 INF - 	mbtiles          30s cpu:59s avg:1.9
0:02:02 INF - 	  read    1x(2% 0.7s wait:29s)
0:02:02 INF - 	  encode  2x(57% 17s wait:3s)
0:02:02 INF - 	  write   1x(26% 8s wait:20s)
0:02:02 INF - ----------------------------------------
0:02:02 INF - 	features	270MB
0:02:02 INF - 	mbtiles	108MB
-rw-r--r-- 1 runner docker 55M Jun  4 00:54 run.jar
ℹ️ This Branch Logs 09b71b8
0:00:00 DEB - argument: config=null (path to config file)
0:00:00 DEB - argument: area=rhode island (name of the extract to download if osm_url/osm_path not specified (i.e. 'monaco' 'rhode island' 'australia' or 'planet'))
0:00:00 INF - Using in-memory stats
0:00:00 INF [overall] - 
0:00:00 INF [overall] - Starting...
0:00:00 DEB - argument: madvise=true (default value for whether to use linux madvise(random) to improve memory-mapped read performance for temporary storage)
0:00:00 DEB - argument: storage=mmap (default storage type for temporary data, one of [ram, mmap, direct])
0:00:00 DEB - argument: threads=2 (num threads)
0:00:00 DEB - argument: write_threads=1 (number of threads to use when writing temp features)
0:00:00 DEB - argument: process_threads=2 (number of threads to use when processing input features)
0:00:00 DEB - argument: bounds=Env[-74.07 : -17.84, 21.34 : 43.55] (bounds)
0:00:00 DEB - argument: feature_read_threads=1 (number of threads to use when reading features at tile write time)
0:00:00 DEB - argument: loginterval=10 seconds (time between logs)
0:00:00 DEB - argument: minzoom=0 (minimum zoom level)
0:00:00 DEB - argument: maxzoom=14 (maximum zoom level (limit 14))
0:00:00 DEB - argument: skip_mbtiles_index_creation=false (skip adding index to mbtiles file)
0:00:00 DEB - argument: optimize_db=false (optimize mbtiles after writing)
0:00:00 DEB - argument: emit_tiles_in_order=true (emit tiles in index order)
0:00:00 DEB - argument: force=false (overwriting output file and ignore disk/RAM warnings)
0:00:00 DEB - argument: gzip_temp=false (gzip temporary feature storage (uses more CPU, but less disk space))
0:00:00 DEB - argument: mmap_temp=true (use memory-mapped IO for temp feature files)
0:00:00 DEB - argument: sort_max_readers=6 (maximum number of concurrent read threads to use when sorting chunks)
0:00:00 DEB - argument: sort_max_writers=6 (maximum number of concurrent write threads to use when sorting chunks)
0:00:00 DEB - argument: nodemap_type=sparsearray (type of node location map, one of [noop, sortedtable, sparsearray, array])
0:00:00 DEB - argument: nodemap_storage=mmap (storage for node location map, one of [ram, mmap, direct])
0:00:00 DEB - argument: nodemap_madvise=true (use linux madvise(random) for node locations)
0:00:00 DEB - argument: multipolygon_geometry_storage=mmap (storage for multipolygon geometries, one of [ram, mmap, direct])
0:00:00 DEB - argument: multipolygon_geometry_madvise=true (use linux madvise(random) for temporary multipolygon geometry storage)
0:00:00 DEB - argument: http_user_agent=Planetiler downloader (https://github.com/onthegomap/planetiler) (User-Agent header to set when downloading files over HTTP)
0:00:00 DEB - argument: http_timeout=30 seconds (Timeout to use when downloading files over HTTP)
0:00:00 DEB - argument: http_retries=1 (Retries to use when downloading files over HTTP)
0:00:00 DEB - argument: download_chunk_size_mb=100 (Size of file chunks to download in parallel in megabytes)
0:00:00 DEB - argument: download_threads=1 (Number of parallel threads to use when downloading each file)
0:00:00 DEB - argument: min_feature_size_at_max_zoom=0.0625 (Default value for the minimum size in tile pixels of features to emit at the maximum zoom level to allow for overzooming)
0:00:00 DEB - argument: min_feature_size=1.0 (Default value for the minimum size in tile pixels of features to emit below the maximum zoom level)
0:00:00 DEB - argument: simplify_tolerance_at_max_zoom=0.0625 (Default value for the tile pixel tolerance to use when simplifying features at the maximum zoom level to allow for overzooming)
0:00:00 DEB - argument: simplify_tolerance=0.1 (Default value for the tile pixel tolerance to use when simplifying features below the maximum zoom level)
0:00:00 DEB - argument: osm_lazy_reads=false (Read OSM blocks from disk in worker threads)
0:00:00 DEB - argument: compact_db=true (Reduce the DB size by separating and deduping the tile data)
0:00:00 DEB - argument: skip_filled_tiles=false (Skip writing tiles containing only polygon fills to the output)
0:00:00 DEB - argument: tmpdir=data/tmp (temp directory)
0:00:00 DEB - argument: only_download=false (download source data then exit)
0:00:00 DEB - argument: download=false (download sources)
0:00:00 DEB - argument: temp_nodes=data/tmp/node.db (temp node db location)
0:00:00 DEB - argument: temp_multipolygons=data/tmp/multipolygon.db (temp multipolygon db location)
0:00:00 DEB - argument: temp_features=data/tmp/feature.db (temp feature db location)
0:00:00 DEB - argument: osm_parse_node_bounds=false (parse bounds from OSM nodes instead of header)
0:00:00 DEB - argument: only_fetch_wikidata=false (fetch wikidata translations then quit)
0:00:00 DEB - argument: fetch_wikidata=false (fetch wikidata translations then continue)
0:00:00 DEB - argument: use_wikidata=true (use wikidata translations)
0:00:00 DEB - argument: wikidata_cache=data/sources/wikidata_names.json (wikidata cache file)
0:00:00 DEB - argument: lake_centerlines_path=data/sources/lake_centerline.shp.zip (lake_centerlines shapefile path)
0:00:00 DEB - argument: free_lake_centerlines_after_read=false (delete lake_centerlines input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: water_polygons_path=data/sources/water-polygons-split-3857.zip (water_polygons shapefile path)
0:00:00 DEB - argument: free_water_polygons_after_read=false (delete water_polygons input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: natural_earth_path=data/sources/natural_earth_vector.sqlite.zip (natural_earth sqlite db path)
0:00:00 DEB - argument: free_natural_earth_after_read=false (delete natural_earth input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: osm_path=data/sources/rhode_island.osm.pbf (osm OSM input file path)
0:00:00 DEB - argument: free_osm_after_read=false (delete osm input file after reading to make space for output (reduces peak disk usage))
0:00:00 DEB - argument: mbtiles=data/out.mbtiles (mbtiles output file)
0:00:00 DEB - argument: transliterate=true (attempt to transliterate latin names)
0:00:00 DEB - argument: languages=am,ar,az,be,bg,br,bs,ca,co,cs,cy,da,de,el,en,eo,es,et,eu,fi,fr,fy,ga,gd,he,hi,hr,hu,hy,id,is,it,ja,ja_kana,ja_rm,ja-Latn,ja-Hira,ka,kk,kn,ko,ko-Latn,ku,la,lb,lt,lv,mk,mt,ml,nl,no,oc,pl,pt,rm,ro,ru,sk,sl,sq,sr,sr-Latn,sv,ta,te,th,tr,uk,zh (languages to use)
0:00:00 DEB - argument: only_layers= (Include only certain layers)
0:00:00 DEB - argument: exclude_layers= (Exclude certain layers)
0:00:00 DEB - argument: boundary_country_names=true (boundary layer: add left/right codes of neighboring countries)
0:00:00 DEB - argument: transportation_z13_paths=false (transportation(_name) layer: show all paths on z13)
0:00:00 DEB - argument: building_merge_z13=true (building layer: merge nearby buildings at z13)
0:00:00 DEB - argument: transportation_name_brunnel=false (transportation_name layer: set to false to omit brunnel and help merge long highways)
0:00:00 DEB - argument: transportation_name_size_for_shield=false (transportation_name layer: allow road names on shorter segments (ie. they will have a shield))
0:00:00 DEB - argument: transportation_name_limit_merge=false (transportation_name layer: limit merge so we don't combine different relations to help merge long highways)
0:00:00 DEB - argument: transportation_name_minor_refs=false (transportation_name layer: include name and refs from minor road networks if not present on a way)
0:00:00 DEB - argument: mbtiles_name=OpenMapTiles ('name' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org ('description' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_attribution=<a href="https://www.openmaptiles.org/" target="_blank">&copy; OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a> ('attribution' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_version=3.13.1 ('version' attribute for mbtiles metadata)
0:00:00 DEB - argument: mbtiles_type=baselayer ('type' attribute for mbtiles metadata)
0:00:00 DEB - argument: help=false (show arguments then exit)
0:00:00 INF - Building BasemapProfile profile into data/out.mbtiles in these phases:
0:00:00 INF -   lake_centerlines: Process features in data/sources/lake_centerline.shp.zip
0:00:00 INF -   water_polygons: Process features in data/sources/water-polygons-split-3857.zip
0:00:00 INF -   natural_earth: Process features in data/sources/natural_earth_vector.sqlite.zip
0:00:00 INF -   osm_pass1: Pre-process OpenStreetMap input (store node locations then relation members)
0:00:00 INF -   osm_pass2: Process OpenStreetMap nodes, ways, then relations
0:00:00 INF -   sort: Sort rendered features by tile ID
0:00:00 INF -   mbtiles: Encode each tile and write to data/out.mbtiles
0:00:00 INF - no wikidata translations found, run with --fetch-wikidata to download
0:00:00 DEB - ✓ 194M storage on / (/dev/root) requested for read phase disk, 29G available
0:00:00 DEB -  - 43M used for temporary node location cache
0:00:00 DEB -  - 6.6M used for temporary multipolygon geometry cache
0:00:00 DEB -  - 144M used for temporary feature storage
0:00:00 DEB - ✓ 216M storage on / (/dev/root) requested for write phase disk, 29G available
0:00:00 DEB -  - 144M used for temporary feature storage
0:00:00 DEB -  - 72M used for mbtiles output
0:00:00 DEB - ✓ 312M JVM heap requested for read phase, 4.2G available
0:00:00 DEB -  - 300M used for sparsearray node location in-memory index
0:00:00 DEB -  - 12M used for temporary profile storage
0:00:00 DEB - ✓ 50M storage on / (/dev/root) requested for read phase, 29G available
0:00:00 DEB -  - 43M used for sparsearray node location cache
0:00:00 DEB -  - 6.6M used for multipolygon way geometries
0:00:00 DEB - ✓ 50M temporary files and 2.9G of free memory for OS to cache them
0:00:00 INF - Using merge sort feature map, chunk size=1431mb max workers=2
0:00:02 INF - dataFileCache open start
0:00:02 INF [lake_centerlines] - 
0:00:02 INF [lake_centerlines] - Starting...
0:00:04 INF [lake_centerlines] -  read: [  59k 100%  27k/s ] write: [    0    0/s ] 0    
    cpus: 1.8 gc:  3% heap: 154M/4.2G direct: 237k postGC: 73M
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:00:04 INF [lake_centerlines] - Finished in 2s cpu:4s avg:1.8
0:00:04 INF [lake_centerlines] -   read     1x(84% 2s)
0:00:04 INF [lake_centerlines] -   process  2x(14% 0.3s wait:2s)
0:00:04 INF [lake_centerlines] -   write    1x(0% 0s wait:2s)
0:00:04 INF [water_polygons] - 
0:00:04 INF [water_polygons] - Starting...
0:00:14 INF [water_polygons] -  read: [ 1.9k  14%  195/s ] write: [  47k 4.6k/s ] 1.4G 
    cpus: 2 gc: 13% heap: 1.2G/4.2G direct: 52M postGC: 1.2G
    read(55%) ->    (0/1k) -> process(44% 11%) ->  (1k/53k) -> write( 0%)
0:00:24 INF [water_polygons] -  read: [ 4.8k  33%  287/s ] write: [ 300k  25k/s ] 1.4G 
    cpus: 1.7 gc:  8% heap: 1.7G/4.2G direct: 52M postGC: 1.7G
    read(70%) ->    (0/1k) -> process(22% 30%) -> (251/53k) -> write( 1%)
0:00:31 INF [water_polygons] -  read: [  14k 100% 1.4k/s ] write: [ 4.3M 613k/s ] 186M 
    cpus: 1.5 gc:  5% heap: 2.7G/4.2G direct: 52M postGC: 1.9G
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:00:31 INF [water_polygons] - Finished in 27s cpu:47s gc:2s avg:1.8
0:00:31 INF [water_polygons] -   read     1x(60% 16s wait:3s)
0:00:31 INF [water_polygons] -   process  2x(28% 8s wait:12s)
0:00:31 INF [water_polygons] -   write    1x(2% 0.6s wait:26s)
0:00:31 INF [natural_earth] - unzipping /home/runner/work/planetiler/planetiler/data/sources/natural_earth_vector.sqlite.zip to data/tmp/natearth.sqlite
0:00:39 INF [natural_earth] - 
0:00:39 INF [natural_earth] - Starting...
0:00:49 INF [natural_earth] -  read: [ 349k 100%  35k/s ] write: [  181   18/s ] 186M 
    cpus: 1.6 gc:  0% heap: 1.3G/4.2G direct: 52M postGC: 189M
    read( -%) ->    (0/1k) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:00:49 INF [natural_earth] - Finished in 10s cpu:17s avg:1.6
0:00:49 INF [natural_earth] -   read     1x(90% 9s sys:2s)
0:00:49 INF [natural_earth] -   process  2x(18% 2s wait:9s)
0:00:49 INF [natural_earth] -   write    1x(0% 0s wait:10s)
0:00:50 INF [osm_pass1] - 
0:00:50 INF [osm_pass1] - Starting...
0:00:52 INF [osm_pass1:process] - Finished nodes: 4,592,898 (1.8M/s) in 2s cpu:4s avg:1.7
0:00:53 INF [osm_pass1:process] - Finished ways: 330,569 (413k/s) in 0.8s cpu:2s avg:2
0:00:53 INF [osm_pass1:process] - Finished relations: 7,705 (143k/s) in 0.1s cpu:0.1s avg:2
0:00:53 INF [osm_pass1] -  nodes: [ 4.5M 1.3M/s ] 414M  ways: [ 330k  95k/s ] rels: [ 7.7k 2.2k/s ] blocks: [  618  177/s ]
    cpus: 1.8 gc:  0% heap: 1.6G/4.2G direct: 52M postGC: 709M hppc: 879k
    read( -%) ->     (0/4) -> parse( -%) ->     (0/4) -> process( -%)
0:00:53 DEB [osm_pass1] - Processed 618 blocks:
0:00:53 DEB [osm_pass1] -   nodes: 4,592,898 (1.8M/s) in 2s cpu:4s avg:1.7
0:00:53 DEB [osm_pass1] -   ways: 330,569 (413k/s) in 0.8s cpu:2s avg:2
0:00:53 DEB [osm_pass1] -   relations: 7,705 (143k/s) in 0.1s cpu:0.1s avg:2
0:00:53 INF [osm_pass1] - Finished in 3s cpu:6s avg:1.8
0:00:53 INF [osm_pass1] -   read     1x(4% 0.1s wait:3s)
0:00:53 INF [osm_pass1] -   parse    1x(69% 2s)
0:00:53 INF [osm_pass1] -   process  1x(42% 1s wait:2s)
0:00:53 INF [osm_pass2] - 
0:00:53 INF [osm_pass2] - Starting...
0:00:56 DEB [osm_pass2:process] - Sorting long long multimap...
0:00:56 DEB [osm_pass2:process] - Sorted long long multimap 0s cpu:0s avg:2
0:00:56 INF [osm_pass2:process] - Finished nodes: 4,592,898 (1.8M/s) in 3s cpu:5s avg:1.9
0:00:56 WAR [osm_pass2:process] - No GB polygon for inferring route network types
0:01:03 INF [osm_pass2] -  nodes: [ 4.5M 100% 458k/s ] 414M  ways: [ 121k  37%  12k/s ] rels: [    0   0%    0/s ] features: [ 4.8M  49k/s ] 1.6G  blocks: [  589  95%   58/s ]
    cpus: 2 gc:  1% heap: 1.1G/4.2G direct: 52M postGC: 827M relInfo: 826k mpGeoms: 574k 
    read( 0%) ->   (11/13) -> process(65% 62%) -> (1.2k/53k) -> write( 2%)
0:01:13 INF [osm_pass2] -  nodes: [ 4.5M 100%    0/s ] 414M  ways: [ 298k  90%  17k/s ] rels: [    0   0%    0/s ] features: [ 5.1M  35k/s ] 1.6G  blocks: [  611  99%    2/s ]
    cpus: 2 gc:  1% heap: 2.5G/4.2G direct: 52M postGC: 842M relInfo: 826k mpGeoms: 19M  
    read( -%) ->    (5/13) -> process(88% 87%) -> (1.5k/53k) -> write( 1%)
0:01:14 INF [osm_pass2:process] - Finished ways: 330,569 (17k/s) in 19s cpu:37s avg:2
0:01:23 INF [osm_pass2] -  nodes: [ 4.5M 100%    0/s ] 414M  ways: [ 330k 100% 3.1k/s ] rels: [ 6.3k  82%  634/s ] features: [ 5.2M  10k/s ] 1.6G  blocks: [  617 100%   <1/s ]
    cpus: 2 gc:  1% heap: 1.8G/4.2G direct: 52M postGC: 829M relInfo: 826k mpGeoms: 19M  
    read( -%) ->    (0/13) -> process(77% 80%) -> (1.5k/53k) -> write( 1%)
0:01:24 INF [osm_pass2:process] - Finished relations: 7,705 (818/s) in 9s cpu:19s avg:2
0:01:26 INF [osm_pass2] -  nodes: [ 4.5M 100%    0/s ] 414M  ways: [ 330k 100%    0/s ] rels: [ 7.7k 100%  497/s ] features: [ 5.2M   3k/s ] 270M  blocks: [  618 100%   <1/s ]
    cpus: 1.9 gc:  0% heap: 1.2G/4.2G direct: 52M postGC: 825M relInfo: 826k mpGeoms: 19M  
    read( -%) ->    (0/13) -> process( -%  -%) ->   (0/53k) -> write( -%)
0:01:26 DEB [osm_pass2] - Processed 618 blocks:
0:01:26 DEB [osm_pass2] -   nodes: 4,592,898 (1.8M/s) in 3s cpu:5s avg:1.9
0:01:26 DEB [osm_pass2] -   ways: 330,569 (17k/s) in 19s cpu:37s avg:2
0:01:26 DEB [osm_pass2] -   relations: 7,705 (818/s) in 9s cpu:19s avg:2
0:01:26 INF [osm_pass2] - Finished in 33s cpu:1m5s avg:2
0:01:26 INF [osm_pass2] -   read     1x(0% 0s wait:16s done:16s)
0:01:26 INF [osm_pass2] -   process  2x(77% 25s)
0:01:26 INF [osm_pass2] -   write    1x(1% 0.4s wait:32s)
0:01:26 INF [boundaries] - 
0:01:26 INF [boundaries] - Starting...
0:01:26 INF [boundaries] - Creating polygons for 1 boundaries
0:01:26 WAR [boundaries] - Unable to form closed polygon for OSM relation 148838 (likely missing edges)
0:01:26 INF [boundaries] - Finished creating 0 country polygons
0:01:26 INF [boundaries] - Finished in 0s cpu:0.1s avg:1.7
0:01:26 INF - Deleting node.db to make room for output file
0:01:26 INF [sort] - 
0:01:26 INF [sort] - Starting...
0:01:26 INF [sort] - Grouped 8 chunks into 1
0:01:28 INF [sort] -  chunks: [   1 /   1 100% ] 270M 
    cpus: 1.4 gc:  0% heap: 1.7G/4.2G direct: 52M postGC: 825M
    ->     (0/3) -> worker(86%)
0:01:28 INF [sort] - Finished in 2s cpu:3s avg:1.4
0:01:28 INF [sort] -   worker  1x(86% 2s)
0:01:28 INF - read:0s write:0s sort:1s
0:01:28 INF [mbtiles] - 
0:01:28 INF [mbtiles] - Starting...
0:01:28 DEB [mbtiles:write] - Execute mbtiles: create table metadata (name text, value text);
0:01:28 DEB [mbtiles:write] - Execute mbtiles: create unique index name on metadata (name);
0:01:28 DEB [mbtiles:write] - Execute mbtiles: create table tiles_shallow (
  zoom_level integer,
  tile_column integer,
  tile_row integer,
  tile_data_id integer

  , primary key(zoom_level,tile_column,tile_row)

) without rowid

0:01:28 DEB [mbtiles:write] - Execute mbtiles: create table tiles_data (
  tile_data_id integer primary key,
  tile_data blob
)

0:01:28 DEB [mbtiles:write] - Execute mbtiles: create view tiles AS
select
  tiles_shallow.zoom_level as zoom_level,
  tiles_shallow.tile_column as tile_column,
  tiles_shallow.tile_row as tile_row,
  tiles_data.tile_data as tile_data
from tiles_shallow
join tiles_data on tiles_shallow.tile_data_id = tiles_data.tile_data_id

0:01:28 DEB [mbtiles:write] - Set mbtiles metadata: name=OpenMapTiles
0:01:29 DEB [mbtiles:write] - Set mbtiles metadata: format=pbf
0:01:29 DEB [mbtiles:write] - Set mbtiles metadata: description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org
0:01:29 DEB [mbtiles:write] - Set mbtiles metadata: attribution=<a href="https://www.openmaptiles.org/" target="_blank">&copy; OpenMapTiles</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">&copy; OpenStreetMap contributors</a>
0:01:29 DEB [mbtiles:write] - Set mbtiles metadata: version=3.13.1
0:01:29 DEB [mbtiles:write] - Set mbtiles metadata: type=baselayer
0:01:29 DEB [mbtiles:write] - Set mbtiles metadata: bounds=-74.07,21.34,-17.84,43.55
0:01:29 DEB [mbtiles:write] - Set mbtiles metadata: center=-45.955,32.445,3
0:01:29 DEB [mbtiles:write] - Set mbtiles metadata: minzoom=0
0:01:29 DEB [mbtiles:write] - Set mbtiles metadata: maxzoom=14
0:01:29 DEB [mbtiles:write] - Set mbtiles metadata: json={"vector_layers":[{"id":"aerodrome_label","fields":{"name_int":"String","iata":"String","ele_ft":"Number","name_de":"String","name":"String","icao":"String","name:en":"String","class":"String","ele":"Number","name_en":"String","name:latin":"String"},"minzoom":10,"maxzoom":14},{"id":"aeroway","fields":{"ref":"String","class":"String"},"minzoom":10,"maxzoom":14},{"id":"boundary","fields":{"disputed":"Number","admin_level":"Number","maritime":"Number","disputed_name":"String"},"minzoom":0,"maxzoom":14},{"id":"building","fields":{"colour":"String","render_height":"Number","render_min_height":"Number"},"minzoom":13,"maxzoom":14},{"id":"housenumber","fields":{"housenumber":"String"},"minzoom":14,"maxzoom":14},{"id":"landcover","fields":{"subclass":"String","class":"String","_numpoints":"Number"},"minzoom":7,"maxzoom":14},{"id":"landuse","fields":{"class":"String"},"minzoom":4,"maxzoom":14},{"id":"mountain_peak","fields":{"name_int":"String","customary_ft":"Number","ele_ft":"Number","name_de":"String","name":"String","rank":"Number","class":"String","name_en":"String","name:latin":"String","ele":"Number"},"minzoom":7,"maxzoom":14},{"id":"park","fields":{"name_int":"String","name_de":"String","name":"String","name:en":"String","class":"String","name_en":"String","name:latin":"String"},"minzoom":6,"maxzoom":14},{"id":"place","fields":{"name:fy":"String","name_int":"String","capital":"Number","name:uk":"String","name:pl":"String","name:nl":"String","name:be":"String","name:ru":"String","name:ko":"String","name_de":"String","name":"String","rank":"Number","name:en":"String","name:eo":"String","class":"String","name:hu":"String","name:ta":"String","name:zh":"String","name_en":"String","name:latin":"String"},"minzoom":2,"maxzoom":14},{"id":"poi","fields":{"name_int":"String","level":"Number","name_de":"String","name":"String","subclass":"String","indoor":"Number","name:en":"String","class":"String","layer":"Number","name:zh":"String","name_en":"String","name:latin":"String"},"minzoom":12,"maxzoom":14},{"id":"transportation","fields":{"brunnel":"String","access":"String","expressway":"Number","bicycle":"String","surface":"String","level":"Number","ramp":"Number","mtb_scale":"String","toll":"Number","layer":"Number","oneway":"Number","network":"String","horse":"String","service":"String","subclass":"String","class":"String","foot":"String"},"minzoom":4,"maxzoom":14},{"id":"transportation_name","fields":{"name_int":"String","route_4":"String","route_3":"String","route_2":"String","route_1":"String","layer":"Number","network":"String","ref":"String","name_de":"String","name":"String","subclass":"String","ref_length":"Number","class":"String","name_en":"String","name:latin":"String"},"minzoom":6,"maxzoom":14},{"id":"water","fields":{"intermittent":"Number","id":"Number","class":"String"},"minzoom":0,"maxzoom":14},{"id":"water_name","fields":{"name_int":"String","name_de":"String","name":"String","intermittent":"Number","class":"String","name_en":"String","name:latin":"String"},"minzoom":9,"maxzoom":14},{"id":"waterway","fields":{"name_int":"String","brunnel":"String","name_de":"String","_relid":"Number","intermittent":"Number","name":"String","class":"String","name:latin":"String","name_en":"String"},"minzoom":4,"maxzoom":14}]}
0:01:30 INF [mbtiles:write] - Starting z0
0:01:30 INF [mbtiles:write] - Finished z0 in 0s cpu:0s avg:0, now starting z1
0:01:30 INF [mbtiles:write] - Finished z1 in 0s cpu:0s avg:0, now starting z2
0:01:30 INF [mbtiles:write] - Finished z2 in 0s cpu:0s avg:0, now starting z3
0:01:30 INF [mbtiles:write] - Finished z3 in 0s cpu:0s avg:0, now starting z4
0:01:30 INF [mbtiles:write] - Finished z4 in 0s cpu:0s avg:0, now starting z5
0:01:30 INF [mbtiles:write] - Finished z5 in 0s cpu:0s avg:0, now starting z6
0:01:30 INF [mbtiles:write] - Finished z6 in 0s cpu:0s avg:0, now starting z7
0:01:31 INF [mbtiles:write] - Finished z7 in 0.7s cpu:1s avg:2, now starting z8
0:01:33 INF [mbtiles:write] - Finished z8 in 2s cpu:3s avg:2, now starting z9
0:01:33 INF [mbtiles:write] - Finished z9 in 0.8s cpu:2s avg:2, now starting z10
0:01:34 INF [mbtiles:write] - Finished z10 in 0.8s cpu:2s avg:2, now starting z11
0:01:36 INF [mbtiles:write] - Finished z11 in 2s cpu:3s avg:2, now starting z12
0:01:38 INF [mbtiles:write] - Finished z12 in 3s cpu:6s avg:2, now starting z13
0:01:39 INF [mbtiles] -  features: [ 488k   9%  48k/s ] 270M  tiles: [ 260k  26k/s ] 12M  
    cpus: 2 gc:  3% heap: 2.1G/4.2G direct: 52M postGC: 770M
    read( 1%) -> (215/217) -> encode(60% 60%) -> (214/216) -> write( 6%)
    last tile: 13/2413/3574 (z13 0%) https://www.openstreetmap.org/#map=13/22.35008/-73.95996
0:01:49 INF [mbtiles] -  features: [ 803k  15%  31k/s ] 270M  tiles: [ 291k   3k/s ] 13M  
    cpus: 2 gc:  3% heap: 780M/4.2G direct: 52M postGC: 825M
    read( 0%) -> (212/217) -> encode(64% 64%) -> (215/216) -> write( 1%)
    last tile: 13/2471/3046 (z13 4%) https://www.openstreetmap.org/#map=13/41.83683/-71.41113
0:01:52 INF [mbtiles:write] - Finished z13 in 13s cpu:27s avg:2, now starting z14
0:01:59 INF [mbtiles] -  features: [ 4.9M  93% 412k/s ] 270M  tiles: [ 3.5M 325k/s ] 98M  
    cpus: 1.9 gc:  1% heap: 2.9G/4.2G direct: 52M postGC: 818M
    read( 5%) ->   (0/217) -> encode(55% 56%) -> (215/216) -> write(62%)
    last tile: 14/6918/6163 (z14 81%) https://www.openstreetmap.org/#map=14/40.66397/-27.99316
0:02:00 DEB [mbtiles:write] - Shallow tiles written: 4,115,450
0:02:00 DEB [mbtiles:write] - Tile data written: 21,424 (99% omitted)
0:02:00 DEB [mbtiles:write] - Unique tile hashes: 11,266
0:02:00 INF [mbtiles:write] - Finished z14 in 8s cpu:14s avg:1.8
0:02:00 INF [mbtiles] -  features: [ 5.2M 100% 298k/s ] 270M  tiles: [ 4.1M 468k/s ] 108M 
    cpus: 1.5 gc:  5% heap: 845M/4.2G direct: 52M postGC: 817M
    read( -%) ->   (0/217) -> encode( -%  -%) ->   (0/216) -> write( -%)
    last tile: 14/7380/5985 (z14 100%) https://www.openstreetmap.org/#map=14/43.56447/-17.84180
0:02:00 DEB [mbtiles] - Tile stats:
0:02:00 DEB [mbtiles] - z0 avg:7.9k max:7.9k
0:02:00 DEB [mbtiles] - z1 avg:4k max:4k
0:02:00 DEB [mbtiles] - z2 avg:9.4k max:9.4k
0:02:00 DEB [mbtiles] - z3 avg:3.9k max:6.4k
0:02:00 DEB [mbtiles] - z4 avg:1.6k max:4.6k
0:02:00 DEB [mbtiles] - z5 avg:1.4k max:8.1k
0:02:00 DEB [mbtiles] - z6 avg:973 max:22k
0:02:00 DEB [mbtiles] - z7 avg:751 max:55k
0:02:00 DEB [mbtiles] - z8 avg:394 max:112k
0:02:00 DEB [mbtiles] - z9 avg:269 max:278k
0:02:00 DEB [mbtiles] - z10 avg:154 max:233k
0:02:00 DEB [mbtiles] - z11 avg:102 max:132k
0:02:00 DEB [mbtiles] - z12 avg:83 max:119k
0:02:00 DEB [mbtiles] - z13 avg:71 max:109k
0:02:00 DEB [mbtiles] - z14 avg:67 max:257k
0:02:00 DEB [mbtiles] - all avg:69 max:0
0:02:00 DEB [mbtiles] -  # features: 5,290,478
0:02:00 DEB [mbtiles] -     # tiles: 4,115,450
0:02:00 INF [mbtiles] - Finished in 32s cpu:1m2s gc:1s avg:1.9
0:02:00 INF [mbtiles] -   read    1x(2% 0.7s wait:30s)
0:02:00 INF [mbtiles] -   encode  2x(58% 18s wait:3s)
0:02:00 INF [mbtiles] -   write   1x(25% 8s wait:21s)
0:02:00 INF - Finished in 2m cpu:3m34s gc:4s avg:1.8
0:02:00 INF - FINISHED!
0:02:00 INF - 
0:02:00 INF - ----------------------------------------
0:02:00 INF - 	overall          2m cpu:3m34s gc:4s avg:1.8
0:02:00 INF - 	lake_centerlines 2s cpu:4s avg:1.8
0:02:00 INF - 	  read     1x(84% 2s)
0:02:00 INF - 	  process  2x(14% 0.3s wait:2s)
0:02:00 INF - 	  write    1x(0% 0s wait:2s)
0:02:00 INF - 	water_polygons   27s cpu:47s gc:2s avg:1.8
0:02:00 INF - 	  read     1x(60% 16s wait:3s)
0:02:00 INF - 	  process  2x(28% 8s wait:12s)
0:02:00 INF - 	  write    1x(2% 0.6s wait:26s)
0:02:00 INF - 	natural_earth    10s cpu:17s avg:1.6
0:02:00 INF - 	  read     1x(90% 9s sys:2s)
0:02:00 INF - 	  process  2x(18% 2s wait:9s)
0:02:00 INF - 	  write    1x(0% 0s wait:10s)
0:02:00 INF - 	osm_pass1        3s cpu:6s avg:1.8
0:02:00 INF - 	  read     1x(4% 0.1s wait:3s)
0:02:00 INF - 	  parse    1x(69% 2s)
0:02:00 INF - 	  process  1x(42% 1s wait:2s)
0:02:00 INF - 	osm_pass2        33s cpu:1m5s avg:2
0:02:00 INF - 	  read     1x(0% 0s wait:16s done:16s)
0:02:00 INF - 	  process  2x(77% 25s)
0:02:00 INF - 	  write    1x(1% 0.4s wait:32s)
0:02:00 INF - 	boundaries       0s cpu:0.1s avg:1.7
0:02:00 INF - 	sort             2s cpu:3s avg:1.4
0:02:00 INF - 	  worker  1x(86% 2s)
0:02:00 INF - 	mbtiles          32s cpu:1m2s gc:1s avg:1.9
0:02:00 INF - 	  read    1x(2% 0.7s wait:30s)
0:02:00 INF - 	  encode  2x(58% 18s wait:3s)
0:02:00 INF - 	  write   1x(25% 8s wait:21s)
0:02:00 INF - ----------------------------------------
0:02:00 INF - 	features	270MB
0:02:00 INF - 	mbtiles	108MB
-rw-r--r-- 1 runner docker 55M Jun  4 00:52 run.jar

if (encoded.length > 1_000_000) {
LOGGER.warn("{} {}kb uncompressed",
tileFeatures.tileCoord(),
encoded.length / 1024);
}
if (compactDb && tileFeatures.getNumFeaturesToEmit() < MAX_FEATURES_HASHING_THRESHOLD) {
if (compactDb && en.containsOnlyPolygonFills()) {
Copy link
Contributor Author

@msbarry msbarry May 27, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bbilger what do you think of using this here instead of the feature count threshold?

The only issue I'm thinking is there are currently seams where ocean polygons overlap where any tile containing the seam won't be just fills but they will be repeated. Another option there would be to merge these ocean polygons (implemented in #235)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@msbarry hard to say w/o a benchmark for encoding but that seems a bit faster. I ran it for Australia twice on this branch and on the main branch. The downside is that the file size increases by almost 100MB since some opportunities to dedupe seem to be missed. So it depends on the goal whether to increase performance a bit or to reduce the file size.

# 1 skip-filled-tiles branch
    mbtiles          1m6s cpu:10m13s gc:4s avg:9.3
	  read    1x(22% 15s sys:2s wait:46s done:3s)
	  encode 11x(68% 45s wait:12s done:3s)
	  write   1x(57% 38s sys:4s wait:23s)
----------------------------------------
	features	3.6GB
	mbtiles	1.8GB

# 2 skip-filled-tiles branch
	mbtiles          1m7s cpu:10m23s gc:4s avg:9.3
	  read    1x(21% 14s sys:1s wait:46s done:3s)
	  encode 11x(68% 46s wait:12s done:3s)
	  write   1x(56% 38s sys:4s wait:24s)
----------------------------------------
	features	3.6GB
	mbtiles	1.8GB

# 3 main branch

	mbtiles          1m8s cpu:10m48s gc:4s avg:9.5
	  read    1x(10% 7s wait:58s done:3s)
	  encode 11x(72% 49s wait:10s done:3s)
	  write   1x(55% 37s sys:3s wait:26s)
----------------------------------------
	features	3.6GB
	mbtiles	1.7GB

# 4 main branch
	mbtiles          1m9s cpu:10m50s gc:4s avg:9.4
	  read    1x(10% 7s wait:58s done:3s)
	  encode 11x(72% 49s wait:11s done:3s)
	  write   1x(54% 37s sys:3s wait:26s)
----------------------------------------
	features	3.6GB
	mbtiles	1.7GB

Copy link
Contributor Author

@msbarry msbarry May 30, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oops, part of this might that I landed #235 but didn't merge it into this branch until just now - the water polygon seams add quite a bit of size and merging them in encode adds a bit of extra time

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

okay, after rebasing the results are almost identical, so don't have any concerns then.

# 5 skip-filled-tiles branch rebased
    mbtiles          1m9s cpu:10m54s gc:4s avg:9.5
	  read    1x(9% 6s wait:58s done:3s)
	  encode 11x(72% 49s wait:10s done:3s)
	  write   1x(54% 37s sys:3s wait:26s)
----------------------------------------
	features	3.6GB
	mbtiles	1.7GB

# 6 skip-filled-tiles branch rebased
	mbtiles          1m9s cpu:10m50s gc:4s avg:9.4
	  read    1x(10% 7s wait:59s done:3s)
	  encode 11x(71% 49s wait:11s done:3s)
	  write   1x(53% 37s sys:3s wait:26s)
----------------------------------------
	features	3.6GB
	mbtiles	1.7GB

(it doesn't matter at all but just to mention: file size is 10MB larger with containsOnlyPolygonFills)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could use num features < 5 OR containsOnlyPolygonFills. On Australia, there are ~40k unique fill tiles, but 800k unique tiles with < 5 features. It's probably worth the slight file size increase to lower the risk of a hash collision...

Copy link
Contributor

@bbilger bbilger Jun 2, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cntFilled     =  636515
cntLt5        = 1422225
ctFilledLt5   =  635047
cntFilledGte5 =    1468
Counted in #tileEncoder like so
...
if (en.containsOnlyPolygonFills()) {
  cntFilled.incrementAndGet();
}
if (tileFeatures.getNumFeaturesToEmit() < 5) {
  cntLt5.incrementAndGet();
}
if (en.containsOnlyPolygonFills() && tileFeatures.getNumFeaturesToEmit() < 5) {
  ctFilledLt5.incrementAndGet();
}
if (en.containsOnlyPolygonFills() && tileFeatures.getNumFeaturesToEmit() >= 5) {
  cntFilledGte5.incrementAndGet();
}
if (compactDb && en.containsOnlyPolygonFills()) {
  tileDataHash = tileFeatures.generateContentHash();
} else {
  tileDataHash = null;
}
...
# containsOnlyPolygonFills
select count(*) from tile_data; -- 1290598

# tileFeatures.getNumFeaturesToEmit() < MAX_FEATURES_HASHING_THRESHOLD
select count(*) from tile_data; -- 1254643

To start with, I don't fully understand the motivation for replacing tileFeatures.getNumFeaturesToEmit() < MAX_FEATURES_HASHING_THRESHOLD by containsOnlyPolygonFills. The threshold check seems simple enough. But I assume you want to avoid unnecessary hash code generation & lookups.

So on the one hand: with the threshold approach we hash twice, and more than required but I think it should be fast enough, and we can remove a few more dupes (~10MB less).
On the other hand with containsOnlyPolygonFills we miss a bunch of dupes, and this check also comes at a cost - but w/o a benchmark it's hard to say which is better/worse - would assume both to be more or less identical overall.

So I'd tend to just keep tileFeatures.getNumFeaturesToEmit() < MAX_FEATURES_HASHING_THRESHOLD. But if avoiding hash generation/lookup is the main motivation and since the few missed dupes are neglectable, I would go with if (compactDb && tileFeatures.getNumFeaturesToEmit() < MAX_FEATURES_HASHING_THRESHOLD && en.containsOnlyPolygonFills()) (i.e. first check threshold to avoid uneccessary #containsOnlyPolygonFills checks)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The thought here was that "is fill" would be a more accurate indicator for whether a tile would be repeated a lot than the feature count heuristic. For example some future tileset where there are >5 polygons overlapping for a large portion of the planet.

For Australia (16,169,927 tiles), it looks like:

# features # tiles repeated tiles repeated (but not fill) tiles
1 13,331,155 13,101,957 6,062
2 1,681,737 1,400,406 7,283
3 583,603 406,630 17,596
4 140,253 17,113 4,566
5 65,943 107 103
6 47,374 15 15
7 36,311 8 8
8 28,772 5 5
9 23,901 4 4
>=10 230,878 31 31

So the isFill check catches 99.8% of repeated tiles and there end up being 41,350 distinct repeated tiles, but the <5 heuristic catches nearly 100% of repeated tiles, but there end up being 810,670 (20x more) distinct tiles. So I guess it's a tradeoff of whether we'd rather get the additional 0.2% to lower the mbtiles size slightly or if we want to minimize the chances of a hash collision by deduping 20x fewer tile hashes.

Copy link
Contributor

@bbilger bbilger Jun 3, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, thanks for the additional explanation and crunching more numbers.

So given that the "is fill"-check should be cheap&fast like you said, and

For example some future tileset where there are >5 polygons overlapping for a large portion of the planet.

and

isFill check catches 99.8% of repeated tiles

and

minimize the chances of a hash collision

are all very good arguments to me to go with your suggestion to use "is fill" instead - and keep the #features out of the equation entirely here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK thanks, I was trying to decide whether isFill() || numFeatures() <= N would be better to catch more repeated tiles, but even just using the lowest threshold of 1 increases # distinct tiles being hashed to 267k (6-7x more) and only catches 17% of the remaining tiles, so it's probably not worth it.

If we wanted to catch more of the repeated tiles, it would probably be better to expand the isFill logic to also identify if the tile contains only edge of a rectangle or segment of a vertical/horizontal line (for example if a tileset includes latitude/longitude graticules).

given that the "is fill"-check should be cheap&fast like you said

I double checked, visualvm shows 100ms on my macbook for australia and it's only taking ~100ms

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like the "isEdge" check on lines and rectangle catches almost all of the other repeated tiles and only increases # distinct tiles to track to 53,491 (30% increase), so I'll add that in to be safe and cover future cases with graticules.

@sonarqubecloud
Copy link

sonarqubecloud bot commented Jun 4, 2022

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 1 Code Smell

96.8% 96.8% Coverage
0.0% 0.0% Duplication

@msbarry msbarry merged commit bed2220 into main Jun 4, 2022
@msbarry msbarry deleted the skip-filled-tiles branch June 4, 2022 01:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[FEATURE] Option to skip writing filled tiles?
2 participants