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

Add support for "files"-archive #761

Merged
merged 11 commits into from
Jan 3, 2024
Merged

Add support for "files"-archive #761

merged 11 commits into from
Jan 3, 2024

Conversation

bbilger
Copy link
Contributor

@bbilger bbilger commented Dec 20, 2023

i.e. write individual pbf-files to disk in the format BASE/z/x/y.pbf

in order to use that format it must be passed as "--ouput=/path/to/tiles?format=files"

Fixes #536

note: it also supports concurrent writing - just have to pass --tile_write_threads=5

Copy link

github-actions bot commented Dec 20, 2023

Base 389ccab This Branch adabc78
0:01:01 DEB [archive] - Tile stats:
0:01:01 DEB [archive] - Biggest tiles (gzipped)
1. 14/4942/6092 (150k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.40015 (poi:72k)
2. 9/154/190 (148k) https://onthegomap.github.io/planetiler-demo/#9.5/41.77078/-71.36719 (landcover:85k)
3. 10/308/380 (138k) https://onthegomap.github.io/planetiler-demo/#10.5/41.90214/-71.54297 (landcover:66k)
4. 10/308/381 (136k) https://onthegomap.github.io/planetiler-demo/#10.5/41.63994/-71.54297 (landcover:72k)
5. 14/4941/6092 (108k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.42212 (poi:53k)
6. 14/4941/6093 (105k) https://onthegomap.github.io/planetiler-demo/#14.5/41.81227/-71.42212 (building:62k)
7. 11/616/762 (99k) https://onthegomap.github.io/planetiler-demo/#11.5/41.7057/-71.63086 (landcover:71k)
8. 11/616/761 (96k) https://onthegomap.github.io/planetiler-demo/#11.5/41.83679/-71.63086 (landcover:72k)
9. 14/4940/6092 (96k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.44409 (building:92k)
10. 11/616/760 (94k) https://onthegomap.github.io/planetiler-demo/#11.5/41.96763/-71.63086 (landcover:73k)
0:01:01 DEB [archive] - Max tile sizes
                      z0    z1    z2    z3    z4    z5    z6    z7    z8    z9   z10   z11   z12   z13   z14   all
           boundary  154   374   443   583   935   336   430   545   545  1.6k  2.1k  7.2k  6.4k  5.8k  4.5k  7.2k
              water 7.7k  3.7k  8.6k  5.5k  2.6k  5.1k   15k   18k   16k   25k   15k   13k   17k   15k   12k   25k
              place    0     0   441   441   441   650   739    1k  1.7k  3.4k  5.8k  3.2k  1.7k   797   947  5.8k
            landuse    0     0     0     0   548   619  1.3k  5.9k   17k   44k   59k   50k   38k   19k   12k   59k
     transportation    0     0     0     0   464   915  1.2k    6k    8k   24k   17k   19k   64k   47k   33k   64k
           waterway    0     0     0     0   111   118     0     0     0  3.2k  2.1k  2.1k  2.1k  4.9k  2.4k  4.9k
               park    0     0     0     0     0     0    1k  3.8k  9.7k   18k   13k  8.1k  4.3k  3.4k  4.4k   18k
transportation_name    0     0     0     0     0     0   359   454  1.2k  1.7k  5.4k  4.6k  3.8k  3.4k   18k   18k
          landcover    0     0     0     0     0     0     0  9.5k   29k   85k   72k   81k   53k   30k   24k   85k
      mountain_peak    0     0     0     0     0     0     0  1.1k  1.8k  3.4k  4.3k  2.8k  1.4k  1.4k   869  4.3k
         water_name    0     0     0     0     0     0     0     0     0   486   461   433   452  1.2k  1.5k  1.5k
    aerodrome_label    0     0     0     0     0     0     0     0     0     0   674   327   273   220   220   674
            aeroway    0     0     0     0     0     0     0     0     0     0  1.6k  2.1k    3k  3.4k  2.7k  3.4k
                poi    0     0     0     0     0     0     0     0     0     0     0     0   501   498   72k   72k
           building    0     0     0     0     0     0     0     0     0     0     0     0     0   59k   92k   92k
        housenumber    0     0     0     0     0     0     0     0     0     0     0     0     0     0   35k   35k
          full tile 7.9k    4k  9.5k  6.5k  3.8k  6.1k   20k   41k   84k  203k  184k  135k  113k  127k  232k  232k
            gzipped 6.2k  3.5k  7.1k  5.2k  3.1k  4.8k   13k   29k   60k  148k  138k   99k   83k   92k  150k  150k
0:01:01 DEB [archive] -    Max tile: 232k (gzipped: 150k)
0:01:01 DEB [archive] -    Avg tile: 5.4k (gzipped: 4k) using weighted average based on OSM traffic
0:01:01 DEB [archive] -     # tiles: 4,115,013
0:01:01 DEB [archive] -  # features: 5,462,060
0:01:01 INF [archive] - Finished in 18s cpu:1m5s avg:3.7
0:01:01 INF [archive] -   read    1x(3% 0.5s wait:16s)
0:01:01 INF [archive] -   encode  4x(55% 10s wait:2s)
0:01:01 INF [archive] -   write   1x(22% 4s wait:12s)
0:01:01 INF - Finished in 1m1s cpu:3m12s gc:1s avg:3.1
0:01:01 INF - FINISHED!
0:01:01 INF - 
0:01:01 INF - ----------------------------------------
0:01:01 INF - data errors:
0:01:01 INF - 	render_snap_fix_input	16,645
0:01:01 INF - 	osm_multipolygon_missing_way	74
0:01:01 INF - 	osm_boundary_missing_way	70
0:01:01 INF - 	merge_snap_fix_input	14
0:01:01 INF - 	feature_centroid_if_convex_osm_invalid_multipolygon_empty_after_fix	2
0:01:01 INF - 	feature_polygon_osm_invalid_multipolygon_empty_after_fix	2
0:01:01 INF - 	omt_park_area_osm_invalid_multipolygon_empty_after_fix	1
0:01:01 INF - ----------------------------------------
0:01:01 INF - 	overall          1m1s cpu:3m12s gc:1s avg:3.1
0:01:01 INF - 	lake_centerlines 2s cpu:5s avg:2.4
0:01:01 INF - 	  read     1x(22% 0.5s done:2s)
0:01:01 INF - 	  process  3x(0% 0s done:2s)
0:01:01 INF - 	  write    1x(0% 0s done:1s)
0:01:01 INF - 	water_polygons   14s cpu:38s avg:2.7
0:01:01 INF - 	  read     1x(42% 6s done:7s)
0:01:01 INF - 	  process  3x(35% 5s wait:2s done:5s)
0:01:01 INF - 	  write    1x(4% 0.5s wait:9s done:5s)
0:01:01 INF - 	natural_earth    6s cpu:12s avg:1.9
0:01:01 INF - 	  read     1x(96% 6s)
0:01:01 INF - 	  process  3x(17% 1s wait:6s)
0:01:01 INF - 	  write    1x(0% 0s wait:6s)
0:01:01 INF - 	osm_pass1        2s cpu:6s avg:3.2
0:01:01 INF - 	  read     1x(2% 0s wait:2s)
0:01:01 INF - 	  parse    2x(60% 1s)
0:01:01 INF - 	  process  1x(65% 1s)
0:01:01 INF - 	osm_pass2        17s cpu:1m1s avg:3.5
0:01:01 INF - 	  read     1x(0% 0s wait:10s done:8s)
0:01:01 INF - 	  process  3x(89% 15s)
0:01:01 INF - 	  write    1x(2% 0.4s wait:17s)
0:01:01 INF - 	boundaries       0s cpu:0s avg:1
0:01:01 INF - 	agg_stop         0s cpu:0s avg:0
0:01:01 INF - 	sort             1s cpu:4s avg:2.7
0:01:01 INF - 	  worker  1x(51% 0.7s)
0:01:01 INF - 	archive          18s cpu:1m5s avg:3.7
0:01:01 INF - 	  read    1x(3% 0.5s wait:16s)
0:01:01 INF - 	  encode  4x(55% 10s wait:2s)
0:01:01 INF - 	  write   1x(22% 4s wait:12s)
0:01:01 INF - ----------------------------------------
0:01:01 INF - 	archive	107MB
0:01:01 INF - 	features	278MB
-rw-r--r-- 1 runner docker 66M Jan  2 22:32 run.jar
0:01:02 DEB [archive] - Tile stats:
0:01:02 DEB [archive] - Biggest tiles (gzipped)
1. 14/4942/6092 (150k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.40015 (poi:72k)
2. 9/154/190 (148k) https://onthegomap.github.io/planetiler-demo/#9.5/41.77078/-71.36719 (landcover:85k)
3. 10/308/380 (137k) https://onthegomap.github.io/planetiler-demo/#10.5/41.90214/-71.54297 (landcover:66k)
4. 10/308/381 (136k) https://onthegomap.github.io/planetiler-demo/#10.5/41.63994/-71.54297 (landcover:72k)
5. 14/4941/6092 (108k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.42212 (poi:53k)
6. 14/4941/6093 (106k) https://onthegomap.github.io/planetiler-demo/#14.5/41.81227/-71.42212 (building:62k)
7. 11/616/762 (99k) https://onthegomap.github.io/planetiler-demo/#11.5/41.7057/-71.63086 (landcover:71k)
8. 14/4940/6092 (96k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.44409 (building:92k)
9. 11/616/761 (96k) https://onthegomap.github.io/planetiler-demo/#11.5/41.83679/-71.63086 (landcover:72k)
10. 14/4942/6091 (95k) https://onthegomap.github.io/planetiler-demo/#14.5/41.84501/-71.40015 (building:79k)
0:01:02 DEB [archive] - Max tile sizes
                      z0    z1    z2    z3    z4    z5    z6    z7    z8    z9   z10   z11   z12   z13   z14   all
           boundary  154   374   443   583   935   336   430   545   545  1.6k  2.1k  7.2k  6.4k  5.8k  4.5k  7.2k
              water 7.7k  3.7k  8.6k  5.5k  2.6k  5.1k   15k   18k   16k   25k   15k   13k   17k   15k   12k   25k
              place    0     0   441   441   441   650   739    1k  1.7k  3.4k  5.8k  3.2k  1.7k   797   947  5.8k
            landuse    0     0     0     0   548   619  1.3k  5.9k   17k   44k   59k   50k   38k   19k   12k   59k
     transportation    0     0     0     0   464   915  1.2k    6k    8k   24k   17k   19k   64k   47k   33k   64k
           waterway    0     0     0     0   111   118     0     0     0  3.2k  2.1k  2.1k  2.1k  4.9k  2.4k  4.9k
               park    0     0     0     0     0     0    1k  3.8k  9.7k   18k   13k  8.1k  4.3k  3.4k  4.4k   18k
transportation_name    0     0     0     0     0     0   359   454  1.2k  1.7k  5.4k  4.6k  3.8k  3.4k   18k   18k
          landcover    0     0     0     0     0     0     0  9.5k   29k   85k   72k   81k   53k   30k   24k   85k
      mountain_peak    0     0     0     0     0     0     0  1.1k  1.8k  3.4k  4.3k  2.8k  1.4k  1.4k   869  4.3k
         water_name    0     0     0     0     0     0     0     0     0   486   461   433   452  1.2k  1.5k  1.5k
    aerodrome_label    0     0     0     0     0     0     0     0     0     0   674   327   273   220   220   674
            aeroway    0     0     0     0     0     0     0     0     0     0  1.6k  2.1k    3k  3.4k  2.7k  3.4k
                poi    0     0     0     0     0     0     0     0     0     0     0     0   501   498   72k   72k
           building    0     0     0     0     0     0     0     0     0     0     0     0     0   59k   92k   92k
        housenumber    0     0     0     0     0     0     0     0     0     0     0     0     0     0   35k   35k
          full tile 7.9k    4k  9.5k  6.5k  3.8k  6.1k   20k   41k   84k  203k  184k  135k  113k  127k  232k  232k
            gzipped 6.2k  3.5k  7.1k  5.2k  3.1k  4.8k   13k   29k   60k  148k  137k   99k   83k   92k  150k  150k
0:01:02 DEB [archive] -    Max tile: 232k (gzipped: 150k)
0:01:02 DEB [archive] -    Avg tile: 5.4k (gzipped: 4k) using weighted average based on OSM traffic
0:01:02 DEB [archive] -     # tiles: 4,115,013
0:01:02 DEB [archive] -  # features: 5,462,060
0:01:02 INF [archive] - Finished in 18s cpu:1m6s avg:3.7
0:01:02 INF [archive] -   read    1x(3% 0.5s wait:17s)
0:01:02 INF [archive] -   encode  4x(56% 10s wait:2s)
0:01:02 INF [archive] -   write   1x(21% 4s wait:13s)
0:01:02 INF - Finished in 1m2s cpu:3m11s gc:1s avg:3.1
0:01:02 INF - FINISHED!
0:01:02 INF - 
0:01:02 INF - ----------------------------------------
0:01:02 INF - data errors:
0:01:02 INF - 	render_snap_fix_input	16,645
0:01:02 INF - 	osm_multipolygon_missing_way	74
0:01:02 INF - 	osm_boundary_missing_way	70
0:01:02 INF - 	merge_snap_fix_input	14
0:01:02 INF - 	feature_centroid_if_convex_osm_invalid_multipolygon_empty_after_fix	2
0:01:02 INF - 	feature_polygon_osm_invalid_multipolygon_empty_after_fix	2
0:01:02 INF - 	omt_park_area_osm_invalid_multipolygon_empty_after_fix	1
0:01:02 INF - ----------------------------------------
0:01:02 INF - 	overall          1m2s cpu:3m11s gc:1s avg:3.1
0:01:02 INF - 	lake_centerlines 3s cpu:6s avg:1.9
0:01:02 INF - 	  read     1x(15% 0.5s done:2s)
0:01:02 INF - 	  process  3x(0% 0s done:2s)
0:01:02 INF - 	  write    1x(0% 0s done:2s)
0:01:02 INF - 	water_polygons   14s cpu:37s avg:2.7
0:01:02 INF - 	  read     1x(42% 6s done:7s)
0:01:02 INF - 	  process  3x(35% 5s wait:3s done:5s)
0:01:02 INF - 	  write    1x(4% 0.5s wait:9s done:5s)
0:01:02 INF - 	natural_earth    6s cpu:12s avg:1.9
0:01:02 INF - 	  read     1x(96% 6s)
0:01:02 INF - 	  process  3x(16% 1s wait:6s)
0:01:02 INF - 	  write    1x(0% 0s wait:6s)
0:01:02 INF - 	osm_pass1        2s cpu:6s avg:3.1
0:01:02 INF - 	  read     1x(2% 0s wait:2s)
0:01:02 INF - 	  parse    2x(59% 1s)
0:01:02 INF - 	  process  1x(66% 1s)
0:01:02 INF - 	osm_pass2        17s cpu:59s avg:3.5
0:01:02 INF - 	  read     1x(0% 0s wait:9s done:8s)
0:01:02 INF - 	  process  3x(89% 15s)
0:01:02 INF - 	  write    1x(2% 0.3s wait:17s)
0:01:02 INF - 	boundaries       0s cpu:0s avg:2
0:01:02 INF - 	agg_stop         0s cpu:0s avg:0
0:01:02 INF - 	sort             1s cpu:4s avg:2.8
0:01:02 INF - 	  worker  1x(52% 0.7s)
0:01:02 INF - 	archive          18s cpu:1m6s avg:3.7
0:01:02 INF - 	  read    1x(3% 0.5s wait:17s)
0:01:02 INF - 	  encode  4x(56% 10s wait:2s)
0:01:02 INF - 	  write   1x(21% 4s wait:13s)
0:01:02 INF - ----------------------------------------
0:01:02 INF - 	archive	107MB
0:01:02 INF - 	features	278MB
-rw-r--r-- 1 runner docker 66M Jan  2 22:31 run.jar

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

ℹ️ Base Logs 389ccab
0:00:00 DEB - argument: config=null (path to config file)
0:00:00 DEB - argument: download_dir=data/sources (download directory)
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 - argument: stats=use in-memory stats
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=4 (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=3 (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: polygon=null (a .poly file that limits output to tiles intersecting the shape)
0:00:00 DEB - argument: minzoom=0 (minimum zoom level)
0:00:00 DEB - argument: maxzoom=14 (maximum zoom level up to 15)
0:00:00 DEB - argument: render_maxzoom=14 (maximum rendering zoom level up to 15)
0:00:00 DEB - argument: tmpdir=data/tmp (temp directory)
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: tile_write_threads=1 (number of threads used to write tiles - only supported by [csv, tsv, proto, pbf, json])
0:00:00 DEB - argument: loginterval=10 seconds (time between logs)
0:00:00 DEB - argument: force=false (overwriting output file and ignore disk/RAM warnings)
0:00:00 DEB - argument: append=false (append to the output file - only supported by [csv, tsv, proto, pbf, json])
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: download_max_bandwidth= (Maximum bandwidth to consume when downloading files in units mb/s, mbps, kbps, etc.)
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=true (Read OSM blocks from disk in worker threads)
0:00:00 DEB - argument: skip_filled_tiles=false (Skip writing tiles containing only polygon fills to the output)
0:00:00 DEB - argument: tile_warning_size_mb=1.0 (Maximum size in megabytes of a tile to emit a warning about)
0:00:00 DEB - argument: color=null (Color the terminal output)
0:00:00 DEB - argument: keep_unzipped=true (keep unzipped sources by default after reading)
0:00:00 DEB - argument: tile_compression=gzip (the tile compression, one of [gzip, none])
0:00:00 DEB - argument: output_layerstats=false (output a tsv.gz file for each tile/layer size)
0:00:00 DEB - argument: debug_url=https://onthegomap.github.io/planetiler-demo/#{z}/{lat}/{lon} (debug url to use for displaying tiles with {z} {lat} {lon} placeholders)
0:00:00 DEB - argument: tile_weights=data/tile_weights.tsv.gz (tsv.gz file with columns z,x,y,loads to generate weighted average tile size stat)
0:00:00 DEB - argument: max_point_buffer=Infinity (Max tile pixels to include points outside tile bounds. Set to a lower value to reduce tile size for clients that handle label collisions across tiles (most web and native clients). NOTE: Do not reduce if you need to support raster tile rendering)
0:00:00 DEB - argument: log_jts_exceptions=false (Emit verbose details to debug JTS geometry errors)
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: download_osm_tile_weights=false (download OSM tile weights file)
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: natural_earth_keep_unzipped=true (keep unzipped natural_earth after reading)
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: output=data/out.mbtiles (output tile archive path)
0:00:00 DEB - argument: version=false (show version then exit)
0:00:00 INF - Planetiler build git hash: 389ccab8e1cefedaeafd32657192da9b6cd401de
0:00:00 INF - Planetiler build version: 0.7-SNAPSHOT
0:00:00 INF - Planetiler build timestamp: 2024-01-02T22:31:23.862Z
0:00:00 DEB - argument: transliterate=true (attempt to transliterate latin names)
0:00:00 DEB - argument: languages=am,ar,az,be,bg,bn,br,bs,ca,co,cs,cy,da,de,el,en,eo,es,et,eu,fa,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,pa,pnb,pl,pt,rm,ro,ru,sk,sl,sq,sr,sr-Latn,sv,ta,te,th,tr,uk,ur,vi,zh,zh-Hant,zh-Hans (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: boundary_osm_only=false (boundary layer: only use OSM, even at low zoom levels)
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: help=false (show arguments then exit)
0:00:00 DEB - argument: layer_stats=/home/runner/work/planetiler/planetiler/data/out.mbtiles.layerstats.tsv.gz (layer stats output path)
0:00:00 INF - Building OpenMapTilesProfile profile into file:///home/runner/work/planetiler/planetiler/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 -   archive: Encode each tile and write to TileArchiveConfig[format=MBTILES, scheme=FILE, uri=file:///home/runner/work/planetiler/planetiler/data/out.mbtiles, options={}]
0:00:00 INF - no wikidata translations found, run with --fetch-wikidata to download
0:00:00 DEB - ✓ 200M storage on / (/dev/root) requested for read phase disk, 24G available
0:00:00 DEB -  - 45M used for temporary node location cache
0:00:00 DEB -  - 6.8M used for temporary multipolygon geometry cache
0:00:00 DEB -  - 148M used for temporary feature storage
0:00:00 DEB - ✓ 223M storage on / (/dev/root) requested for write phase disk, 24G available
0:00:00 DEB -  - 148M used for temporary feature storage
0:00:00 DEB -  - 74M used for archive output
0:00:00 DEB - ✓ 313M 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 -  - 13M used for temporary profile storage
0:00:00 DEB - ✓ 52M storage on / (/dev/root) requested for read phase, 24G available
0:00:00 DEB -  - 45M used for sparsearray node location cache
0:00:00 DEB -  - 6.8M used for multipolygon way geometries
0:00:00 DEB - ✓ 52M temporary files and 12G of free memory for OS to cache them
0:00:00 DEB - argument: archive_name=OpenMapTiles ('name' attribute for tileset metadata)
0:00:00 DEB - argument: archive_description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org ('description' attribute for tileset metadata)
0:00:00 DEB - argument: archive_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 tileset metadata)
0:00:00 DEB - argument: archive_version=3.14.0 ('version' attribute for tileset metadata)
0:00:00 DEB - argument: archive_type=baselayer ('type' attribute for tileset metadata)
0:00:00 DEB - argument: archive_format=pbf ('format' attribute for tileset metadata)
0:00:00 DEB - argument: compact=true (mbtiles: reduce the DB size by separating and deduping the tile data)
0:00:00 DEB - argument: no_index=false (mbtiles: skip adding index to sqlite DB)
0:00:00 DEB - argument: vacuum_analyze=false (mbtiles: vacuum analyze sqlite DB after writing)
0:00:00 INF - Using merge sort feature map, chunk size=1431mb max workers=4
0:00:00 INF [lake_centerlines] - 
0:00:00 INF [lake_centerlines] - Starting...
0:00:02 INF [lake_centerlines] -  read: [  200 100%  325/s ] write: [    0    0/s ] 0    
    cpus: 1 gc:  0% heap: 47M/4.2G direct: 262k postGC: 80M
    ->     (0/3) -> read( -%) ->    (0/1k) -> process( -%  -%  -%) ->   (0/54k) -> write( -%)
0:00:02 INF [lake_centerlines] - Finished in 2s cpu:5s avg:2.4
0:00:02 INF [lake_centerlines] -   read     1x(22% 0.5s done:2s)
0:00:02 INF [lake_centerlines] -   process  3x(0% 0s done:2s)
0:00:02 INF [lake_centerlines] -   write    1x(0% 0s done:1s)
0:00:02 INF [water_polygons] - 
0:00:02 INF [water_polygons] - Starting...
0:00:16 INF [water_polygons] -  read: [  244 100%   26/s ] write: [ 4.3M 466k/s ] 186M 
    cpus: 3.6 gc:  1% heap: 1.3G/4.2G direct: 54M postGC: 296M
    ->     (0/3) -> read( -%) ->    (0/1k) -> process( -%  -%  -%) ->   (0/54k) -> write( -%)
0:00:16 INF [water_polygons] - Finished in 14s cpu:38s avg:2.7
0:00:16 INF [water_polygons] -   read     1x(42% 6s done:7s)
0:00:16 INF [water_polygons] -   process  3x(35% 5s wait:2s done:5s)
0:00:16 INF [water_polygons] -   write    1x(4% 0.5s wait:9s done:5s)
0:00:16 INF [natural_earth] - 
0:00:16 INF [natural_earth] - Starting...
0:00:23 INF [natural_earth] -  read: [ 349k 100%  56k/s ] write: [  181   29/s ] 186M 
    cpus: 1.9 gc:  0% heap: 1.9G/4.2G direct: 54M postGC: 273M
    ->     (0/3) -> read( -%) ->    (0/1k) -> process( -%  -%  -%) ->   (0/54k) -> write( -%)
0:00:23 INF [natural_earth] - Finished in 6s cpu:12s avg:1.9
0:00:23 INF [natural_earth] -   read     1x(96% 6s)
0:00:23 INF [natural_earth] -   process  3x(17% 1s wait:6s)
0:00:23 INF [natural_earth] -   write    1x(0% 0s wait:6s)
0:00:23 INF [osm_pass1] - 
0:00:23 INF [osm_pass1] - Starting...
0:00:24 INF [osm_pass1:process] - Finished nodes: 4,761,785 (3.7M/s) in 1s cpu:4s avg:3
0:00:24 INF [osm_pass1:process] - Finished ways: 358,083 (827k/s) in 0.4s cpu:2s avg:3.5
0:00:24 INF [osm_pass1:process] - Finished relations: 6,089 (78k/s) in 0.1s cpu:0.3s avg:3.6
0:00:24 INF [osm_pass1] -  nodes: [ 4.7M 2.6M/s ] 491M  ways: [ 358k 195k/s ] rels: [   6k 3.3k/s ] blocks: [  642  350/s ]
    cpus: 3.2 gc:  0% heap: 2.8G/4.2G direct: 54M postGC: 818M hppc: 467k
    read( -%) ->     (0/7) -> parse( -%  -%) ->     (0/6) -> process( -%)
0:00:25 DEB [osm_pass1] - Processed 642 blocks:
0:00:25 DEB [osm_pass1] -   nodes: 4,761,785 (3.7M/s) in 1s cpu:4s avg:3
0:00:25 DEB [osm_pass1] -   ways: 358,083 (827k/s) in 0.4s cpu:2s avg:3.5
0:00:25 DEB [osm_pass1] -   relations: 6,089 (78k/s) in 0.1s cpu:0.3s avg:3.6
0:00:25 INF [osm_pass1] - Finished in 2s cpu:6s avg:3.2
0:00:25 INF [osm_pass1] -   read     1x(2% 0s wait:2s)
0:00:25 INF [osm_pass1] -   parse    2x(60% 1s)
0:00:25 INF [osm_pass1] -   process  1x(65% 1s)
0:00:25 INF [osm_pass2] - 
0:00:25 INF [osm_pass2] - Starting...
0:00:26 DEB [osm_pass2:process] - Sorting long long multimap...
0:00:26 INF [osm_pass2:process] - Finished nodes: 4,761,785 (3.7M/s) in 1s cpu:5s avg:3.9
0:00:26 DEB [osm_pass2:process] - Sorted long long multimap 0s cpu:0.1s avg:3.6
0:00:26 WAR [osm_pass2:process] - No GB polygon for inferring route network types
0:00:35 INF [osm_pass2] -  nodes: [ 4.7M 100% 476k/s ] 491M  ways: [ 292k  82%  29k/s ] rels: [    0   0%    0/s ] features: [ 5.2M  95k/s ] 1.6G  blocks: [  631  98%   63/s ]
    cpus: 3.6 gc:  2% heap: 3.3G/4.2G direct: 54M postGC: 1.1G relInfo: 441k mpGeoms: 17M  
    read( -%) ->    (8/14) -> process(85% 86% 84%) -> (1.6k/54k) -> write( 3%)
0:00:35 INF [osm_pass2:process] - Finished ways: 358,083 (37k/s) in 10s cpu:34s avg:3.5
0:00:40 INF [osm_pass2:process] - Finished relations: 6,089 (1.2k/s) in 5s cpu:17s avg:3.4
0:00:42 INF [osm_pass2] -  nodes: [ 4.7M 100%    0/s ] 491M  ways: [ 358k 100% 8.8k/s ] rels: [   6k 100%  824/s ] features: [ 5.4M  25k/s ] 278M  blocks: [  642 100%    1/s ]
    cpus: 3.4 gc:  1% heap: 1.8G/4.2G direct: 54M postGC: 1G relInfo: 441k mpGeoms: 18M  
    read( -%) ->    (0/14) -> process( -%  -%  -%) ->   (0/54k) -> write( -%)
0:00:42 DEB [osm_pass2] - Processed 642 blocks:
0:00:42 DEB [osm_pass2] -   nodes: 4,761,785 (3.7M/s) in 1s cpu:5s avg:3.9
0:00:42 DEB [osm_pass2] -   ways: 358,083 (37k/s) in 10s cpu:34s avg:3.5
0:00:42 DEB [osm_pass2] -   relations: 6,089 (1.2k/s) in 5s cpu:17s avg:3.4
0:00:42 INF [osm_pass2] - Finished in 17s cpu:1m1s avg:3.5
0:00:42 INF [osm_pass2] -   read     1x(0% 0s wait:10s done:8s)
0:00:42 INF [osm_pass2] -   process  3x(89% 15s)
0:00:42 INF [osm_pass2] -   write    1x(2% 0.4s wait:17s)
0:00:42 INF [boundaries] - 
0:00:42 INF [boundaries] - Starting...
0:00:42 INF [boundaries] - Creating polygons for 1 boundaries
0:00:42 WAR [boundaries] - Unable to form closed polygon for OSM relation 148838 (likely missing edges)
0:00:42 INF [boundaries] - Finished creating 0 country polygons
0:00:42 INF [boundaries] - Finished in 0s cpu:0s avg:1
0:00:42 INF [agg_stop] - 
0:00:42 INF [agg_stop] - Starting...
0:00:42 INF [agg_stop] - Processing 0 agg_stop sets
0:00:42 INF [agg_stop] - Finished in 0s cpu:0s avg:0
0:00:42 INF - Deleting node.db to make room for output file
0:00:42 INF [sort] - 
0:00:42 INF [sort] - Starting...
0:00:42 INF [sort] - Grouped 8 chunks into 1
0:00:43 INF [sort] -  chunks: [   1 /   1 100% ] 278M 
    cpus: 2.7 gc:  0% heap: 2.3G/4.2G direct: 54M postGC: 1G
    ->     (0/3) -> worker( -%)
0:00:43 INF [sort] - Finished in 1s cpu:4s avg:2.7
0:00:43 INF [sort] -   worker  1x(51% 0.7s)
0:00:43 INF - read:0s write:0s sort:0s
0:00:43 INF [archive] - 
0:00:43 INF [archive] - Starting...
0:00:44 DEB [archive:write] - Execute mbtiles: create table metadata (name text, value text);
0:00:44 DEB [archive:write] - Execute mbtiles: create unique index name on metadata (name);
0:00:44 DEB [archive: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:00:44 DEB [archive:write] - Execute mbtiles: create table tiles_data (
  tile_data_id integer primary key,
  tile_data blob
)

0:00:44 DEB [archive: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:00:46 INF [archive:write] - Starting z0
0:00:46 INF [archive:write] - Finished z0 in 0s cpu:0s avg:0, now starting z1
0:00:46 INF [archive:write] - Finished z1 in 0s cpu:0s avg:0, now starting z2
0:00:46 INF [archive:write] - Finished z2 in 0s cpu:0s avg:0, now starting z3
0:00:46 INF [archive:write] - Finished z3 in 0s cpu:0s avg:0, now starting z4
0:00:46 INF [archive:write] - Finished z4 in 0s cpu:0s avg:68.5, now starting z5
0:00:46 INF [archive:write] - Finished z5 in 0s cpu:0s avg:0, now starting z6
0:00:46 INF [archive:write] - Finished z6 in 0s cpu:0s avg:0, now starting z7
0:00:46 INF [archive:write] - Finished z7 in 0s cpu:0s avg:6, now starting z8
0:00:47 INF [archive:write] - Finished z8 in 1s cpu:5s avg:4, now starting z9
0:00:48 INF [archive:write] - Finished z9 in 0.9s cpu:3s avg:4, now starting z10
0:00:48 INF [archive:write] - Finished z10 in 0.4s cpu:2s avg:3.9, now starting z11
0:00:50 INF [archive:write] - Finished z11 in 1s cpu:6s avg:4, now starting z12
0:00:52 INF [archive:write] - Finished z12 in 2s cpu:9s avg:4, now starting z13
0:00:54 INF [archive] -  features: [ 857k  16%  85k/s ] 278M  tiles: [ 291k  29k/s ] 14M  
    cpus: 4 gc:  4% heap: 2.3G/4.2G direct: 54M postGC: 553M
    read( 1%) -> (212/219) -> encode(63% 57% 62% 59%) -> (215/216) -> write( 4%)
    last tile: 13/2470/3048 (z13 5%) https://onthegomap.github.io/planetiler-demo/#13.5/41.75492/-71.43311
0:00:57 INF [archive:write] - Finished z13 in 5s cpu:20s avg:4, now starting z14
0:01:01 DEB [archive:write] - Shallow tiles written: 4,115,013
0:01:01 DEB [archive:write] - Tile data written: 17,201 (100% omitted)
0:01:01 DEB [archive:write] - Unique tile hashes: 8,351
0:01:01 INF [archive:write] - Finished z14 in 4s cpu:10s avg:2.9
0:01:01 DEB [archive:write] - Set mbtiles metadata: format=pbf
0:01:01 DEB [archive:write] - Set mbtiles metadata: center=-45.955,32.445,3
0:01:01 DEB [archive:write] - Set mbtiles metadata: bounds=-74.07,21.34,-17.84,43.55
0:01:01 DEB [archive: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"},"minzoom":0,"maxzoom":14},{"id":"building","fields":{"colour":"String","render_height":"Number","render_min_height":"Number","hide_3d":"Boolean"},"minzoom":13,"maxzoom":14},{"id":"housenumber","fields":{"housenumber":"String"},"minzoom":14,"maxzoom":14},{"id":"landcover","fields":{"subclass":"String","class":"String"},"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","... 2465 more characters
0:01:01 DEB [archive:write] - Set mbtiles metadata: name=OpenMapTiles
0:01:01 DEB [archive:write] - Set mbtiles metadata: description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org
0:01:01 DEB [archive: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:01 DEB [archive:write] - Set mbtiles metadata: version=3.14.0
0:01:01 DEB [archive:write] - Set mbtiles metadata: type=baselayer
0:01:01 DEB [archive:write] - Set mbtiles metadata: minzoom=0
0:01:01 DEB [archive:write] - Set mbtiles metadata: maxzoom=14
0:01:01 DEB [archive:write] - Set mbtiles metadata: compression=gzip
0:01:01 DEB [archive:write] - Set mbtiles metadata: planetiler:version=0.7-SNAPSHOT
0:01:01 DEB [archive:write] - Set mbtiles metadata: planetiler:githash=389ccab8e1cefedaeafd32657192da9b6cd401de
0:01:01 DEB [archive:write] - Set mbtiles metadata: planetiler:buildtime=2024-01-02T22:31:23.862Z
0:01:01 DEB [archive:write] - Set mbtiles metadata: planetiler:osm:osmosisreplicationtime=2024-01-01T21:21:15Z
0:01:01 DEB [archive:write] - Set mbtiles metadata: planetiler:osm:osmosisreplicationseq=3929
0:01:01 DEB [archive:write] - Set mbtiles metadata: planetiler:osm:osmosisreplicationurl=http://download.geofabrik.de/north-america/us/rhode-island-updates
0:01:01 INF [archive] -  features: [ 5.4M 100% 666k/s ] 278M  tiles: [ 4.1M 553k/s ] 107M 
    cpus: 3.4 gc:  2% heap: 1.7G/4.2G direct: 54M postGC: 538M
    read( -%) ->   (0/219) -> encode( -%  -%  -%  -%) ->   (0/216) -> write( -%)
    last tile: 14/7380/5985 (z14 100%) https://onthegomap.github.io/planetiler-demo/#14.5/43.55651/-17.83081
0:01:01 DEB [archive] - Tile stats:
0:01:01 DEB [archive] - Biggest tiles (gzipped)
1. 14/4942/6092 (150k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.40015 (poi:72k)
2. 9/154/190 (148k) https://onthegomap.github.io/planetiler-demo/#9.5/41.77078/-71.36719 (landcover:85k)
3. 10/308/380 (138k) https://onthegomap.github.io/planetiler-demo/#10.5/41.90214/-71.54297 (landcover:66k)
4. 10/308/381 (136k) https://onthegomap.github.io/planetiler-demo/#10.5/41.63994/-71.54297 (landcover:72k)
5. 14/4941/6092 (108k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.42212 (poi:53k)
6. 14/4941/6093 (105k) https://onthegomap.github.io/planetiler-demo/#14.5/41.81227/-71.42212 (building:62k)
7. 11/616/762 (99k) https://onthegomap.github.io/planetiler-demo/#11.5/41.7057/-71.63086 (landcover:71k)
8. 11/616/761 (96k) https://onthegomap.github.io/planetiler-demo/#11.5/41.83679/-71.63086 (landcover:72k)
9. 14/4940/6092 (96k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.44409 (building:92k)
10. 11/616/760 (94k) https://onthegomap.github.io/planetiler-demo/#11.5/41.96763/-71.63086 (landcover:73k)
0:01:01 DEB [archive] - Max tile sizes
                      z0    z1    z2    z3    z4    z5    z6    z7    z8    z9   z10   z11   z12   z13   z14   all
           boundary  154   374   443   583   935   336   430   545   545  1.6k  2.1k  7.2k  6.4k  5.8k  4.5k  7.2k
              water 7.7k  3.7k  8.6k  5.5k  2.6k  5.1k   15k   18k   16k   25k   15k   13k   17k   15k   12k   25k
              place    0     0   441   441   441   650   739    1k  1.7k  3.4k  5.8k  3.2k  1.7k   797   947  5.8k
            landuse    0     0     0     0   548   619  1.3k  5.9k   17k   44k   59k   50k   38k   19k   12k   59k
     transportation    0     0     0     0   464   915  1.2k    6k    8k   24k   17k   19k   64k   47k   33k   64k
           waterway    0     0     0     0   111   118     0     0     0  3.2k  2.1k  2.1k  2.1k  4.9k  2.4k  4.9k
               park    0     0     0     0     0     0    1k  3.8k  9.7k   18k   13k  8.1k  4.3k  3.4k  4.4k   18k
transportation_name    0     0     0     0     0     0   359   454  1.2k  1.7k  5.4k  4.6k  3.8k  3.4k   18k   18k
          landcover    0     0     0     0     0     0     0  9.5k   29k   85k   72k   81k   53k   30k   24k   85k
      mountain_peak    0     0     0     0     0     0     0  1.1k  1.8k  3.4k  4.3k  2.8k  1.4k  1.4k   869  4.3k
         water_name    0     0     0     0     0     0     0     0     0   486   461   433   452  1.2k  1.5k  1.5k
    aerodrome_label    0     0     0     0     0     0     0     0     0     0   674   327   273   220   220   674
            aeroway    0     0     0     0     0     0     0     0     0     0  1.6k  2.1k    3k  3.4k  2.7k  3.4k
                poi    0     0     0     0     0     0     0     0     0     0     0     0   501   498   72k   72k
           building    0     0     0     0     0     0     0     0     0     0     0     0     0   59k   92k   92k
        housenumber    0     0     0     0     0     0     0     0     0     0     0     0     0     0   35k   35k
          full tile 7.9k    4k  9.5k  6.5k  3.8k  6.1k   20k   41k   84k  203k  184k  135k  113k  127k  232k  232k
            gzipped 6.2k  3.5k  7.1k  5.2k  3.1k  4.8k   13k   29k   60k  148k  138k   99k   83k   92k  150k  150k
0:01:01 DEB [archive] -    Max tile: 232k (gzipped: 150k)
0:01:01 DEB [archive] -    Avg tile: 5.4k (gzipped: 4k) using weighted average based on OSM traffic
0:01:01 DEB [archive] -     # tiles: 4,115,013
0:01:01 DEB [archive] -  # features: 5,462,060
0:01:01 INF [archive] - Finished in 18s cpu:1m5s avg:3.7
0:01:01 INF [archive] -   read    1x(3% 0.5s wait:16s)
0:01:01 INF [archive] -   encode  4x(55% 10s wait:2s)
0:01:01 INF [archive] -   write   1x(22% 4s wait:12s)
0:01:01 INF - Finished in 1m1s cpu:3m12s gc:1s avg:3.1
0:01:01 INF - FINISHED!
0:01:01 INF - 
0:01:01 INF - ----------------------------------------
0:01:01 INF - data errors:
0:01:01 INF - 	render_snap_fix_input	16,645
0:01:01 INF - 	osm_multipolygon_missing_way	74
0:01:01 INF - 	osm_boundary_missing_way	70
0:01:01 INF - 	merge_snap_fix_input	14
0:01:01 INF - 	feature_centroid_if_convex_osm_invalid_multipolygon_empty_after_fix	2
0:01:01 INF - 	feature_polygon_osm_invalid_multipolygon_empty_after_fix	2
0:01:01 INF - 	omt_park_area_osm_invalid_multipolygon_empty_after_fix	1
0:01:01 INF - ----------------------------------------
0:01:01 INF - 	overall          1m1s cpu:3m12s gc:1s avg:3.1
0:01:01 INF - 	lake_centerlines 2s cpu:5s avg:2.4
0:01:01 INF - 	  read     1x(22% 0.5s done:2s)
0:01:01 INF - 	  process  3x(0% 0s done:2s)
0:01:01 INF - 	  write    1x(0% 0s done:1s)
0:01:01 INF - 	water_polygons   14s cpu:38s avg:2.7
0:01:01 INF - 	  read     1x(42% 6s done:7s)
0:01:01 INF - 	  process  3x(35% 5s wait:2s done:5s)
0:01:01 INF - 	  write    1x(4% 0.5s wait:9s done:5s)
0:01:01 INF - 	natural_earth    6s cpu:12s avg:1.9
0:01:01 INF - 	  read     1x(96% 6s)
0:01:01 INF - 	  process  3x(17% 1s wait:6s)
0:01:01 INF - 	  write    1x(0% 0s wait:6s)
0:01:01 INF - 	osm_pass1        2s cpu:6s avg:3.2
0:01:01 INF - 	  read     1x(2% 0s wait:2s)
0:01:01 INF - 	  parse    2x(60% 1s)
0:01:01 INF - 	  process  1x(65% 1s)
0:01:01 INF - 	osm_pass2        17s cpu:1m1s avg:3.5
0:01:01 INF - 	  read     1x(0% 0s wait:10s done:8s)
0:01:01 INF - 	  process  3x(89% 15s)
0:01:01 INF - 	  write    1x(2% 0.4s wait:17s)
0:01:01 INF - 	boundaries       0s cpu:0s avg:1
0:01:01 INF - 	agg_stop         0s cpu:0s avg:0
0:01:01 INF - 	sort             1s cpu:4s avg:2.7
0:01:01 INF - 	  worker  1x(51% 0.7s)
0:01:01 INF - 	archive          18s cpu:1m5s avg:3.7
0:01:01 INF - 	  read    1x(3% 0.5s wait:16s)
0:01:01 INF - 	  encode  4x(55% 10s wait:2s)
0:01:01 INF - 	  write   1x(22% 4s wait:12s)
0:01:01 INF - ----------------------------------------
0:01:01 INF - 	archive	107MB
0:01:01 INF - 	features	278MB
-rw-r--r-- 1 runner docker 66M Jan  2 22:32 run.jar
ℹ️ This Branch Logs adabc78
0:00:00 DEB - argument: config=null (path to config file)
0:00:00 DEB - argument: download_dir=data/sources (download directory)
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 - argument: stats=use in-memory stats
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=4 (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=3 (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: polygon=null (a .poly file that limits output to tiles intersecting the shape)
0:00:00 DEB - argument: minzoom=0 (minimum zoom level)
0:00:00 DEB - argument: maxzoom=14 (maximum zoom level up to 15)
0:00:00 DEB - argument: render_maxzoom=14 (maximum rendering zoom level up to 15)
0:00:00 DEB - argument: tmpdir=data/tmp (temp directory)
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: tile_write_threads=1 (number of threads used to write tiles - only supported by [files, csv, tsv, proto, pbf, json])
0:00:00 DEB - argument: loginterval=10 seconds (time between logs)
0:00:00 DEB - argument: force=false (overwriting output file and ignore disk/RAM warnings)
0:00:00 DEB - argument: append=false (append to the output file - only supported by [files, csv, tsv, proto, pbf, json])
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: download_max_bandwidth= (Maximum bandwidth to consume when downloading files in units mb/s, mbps, kbps, etc.)
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=true (Read OSM blocks from disk in worker threads)
0:00:00 DEB - argument: skip_filled_tiles=false (Skip writing tiles containing only polygon fills to the output)
0:00:00 DEB - argument: tile_warning_size_mb=1.0 (Maximum size in megabytes of a tile to emit a warning about)
0:00:00 DEB - argument: color=null (Color the terminal output)
0:00:00 DEB - argument: keep_unzipped=true (keep unzipped sources by default after reading)
0:00:00 DEB - argument: tile_compression=gzip (the tile compression, one of [gzip, none])
0:00:00 DEB - argument: output_layerstats=false (output a tsv.gz file for each tile/layer size)
0:00:00 DEB - argument: debug_url=https://onthegomap.github.io/planetiler-demo/#{z}/{lat}/{lon} (debug url to use for displaying tiles with {z} {lat} {lon} placeholders)
0:00:00 DEB - argument: tile_weights=data/tile_weights.tsv.gz (tsv.gz file with columns z,x,y,loads to generate weighted average tile size stat)
0:00:00 DEB - argument: max_point_buffer=Infinity (Max tile pixels to include points outside tile bounds. Set to a lower value to reduce tile size for clients that handle label collisions across tiles (most web and native clients). NOTE: Do not reduce if you need to support raster tile rendering)
0:00:00 DEB - argument: log_jts_exceptions=false (Emit verbose details to debug JTS geometry errors)
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: download_osm_tile_weights=false (download OSM tile weights file)
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: natural_earth_keep_unzipped=true (keep unzipped natural_earth after reading)
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: output=data/out.mbtiles (output tile archive path)
0:00:00 DEB - argument: version=false (show version then exit)
0:00:00 INF - Planetiler build git hash: adabc786eca75450ffa01e4b9506d96c2f517b09
0:00:00 INF - Planetiler build version: 0.7-SNAPSHOT
0:00:00 INF - Planetiler build timestamp: 2024-01-02T22:30:56.277Z
0:00:00 DEB - argument: transliterate=true (attempt to transliterate latin names)
0:00:00 DEB - argument: languages=am,ar,az,be,bg,bn,br,bs,ca,co,cs,cy,da,de,el,en,eo,es,et,eu,fa,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,pa,pnb,pl,pt,rm,ro,ru,sk,sl,sq,sr,sr-Latn,sv,ta,te,th,tr,uk,ur,vi,zh,zh-Hant,zh-Hans (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: boundary_osm_only=false (boundary layer: only use OSM, even at low zoom levels)
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: help=false (show arguments then exit)
0:00:00 DEB - argument: layer_stats=/home/runner/work/planetiler/planetiler/data/out.mbtiles.layerstats.tsv.gz (layer stats output path)
0:00:00 INF - Building OpenMapTilesProfile profile into file:///home/runner/work/planetiler/planetiler/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 -   archive: Encode each tile and write to TileArchiveConfig[format=MBTILES, scheme=FILE, uri=file:///home/runner/work/planetiler/planetiler/data/out.mbtiles, options={}]
0:00:00 INF - no wikidata translations found, run with --fetch-wikidata to download
0:00:00 DEB - ✓ 200M storage on / (/dev/root) requested for read phase disk, 24G available
0:00:00 DEB -  - 45M used for temporary node location cache
0:00:00 DEB -  - 6.8M used for temporary multipolygon geometry cache
0:00:00 DEB -  - 148M used for temporary feature storage
0:00:00 DEB - ✓ 223M storage on / (/dev/root) requested for write phase disk, 24G available
0:00:00 DEB -  - 148M used for temporary feature storage
0:00:00 DEB -  - 74M used for archive output
0:00:00 DEB - ✓ 313M 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 -  - 13M used for temporary profile storage
0:00:00 DEB - ✓ 52M storage on / (/dev/root) requested for read phase, 24G available
0:00:00 DEB -  - 45M used for sparsearray node location cache
0:00:00 DEB -  - 6.8M used for multipolygon way geometries
0:00:00 DEB - ✓ 52M temporary files and 12G of free memory for OS to cache them
0:00:00 DEB - argument: archive_name=OpenMapTiles ('name' attribute for tileset metadata)
0:00:00 DEB - argument: archive_description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org ('description' attribute for tileset metadata)
0:00:00 DEB - argument: archive_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 tileset metadata)
0:00:00 DEB - argument: archive_version=3.14.0 ('version' attribute for tileset metadata)
0:00:00 DEB - argument: archive_type=baselayer ('type' attribute for tileset metadata)
0:00:00 DEB - argument: archive_format=pbf ('format' attribute for tileset metadata)
0:00:00 DEB - argument: compact=true (mbtiles: reduce the DB size by separating and deduping the tile data)
0:00:00 DEB - argument: no_index=false (mbtiles: skip adding index to sqlite DB)
0:00:00 DEB - argument: vacuum_analyze=false (mbtiles: vacuum analyze sqlite DB after writing)
0:00:00 INF - Using merge sort feature map, chunk size=1431mb max workers=4
0:00:00 INF [lake_centerlines] - 
0:00:00 INF [lake_centerlines] - Starting...
0:00:03 INF [lake_centerlines] -  read: [  200 100%  327/s ] write: [    0    0/s ] 0    
    cpus: 1.5 gc:  0% heap: 45M/4.2G direct: 262k postGC: 81M
    ->     (0/3) -> read( -%) ->    (0/1k) -> process( -%  -%  -%) ->   (0/54k) -> write( -%)
0:00:03 INF [lake_centerlines] - Finished in 3s cpu:6s avg:1.9
0:00:03 INF [lake_centerlines] -   read     1x(15% 0.5s done:2s)
0:00:03 INF [lake_centerlines] -   process  3x(0% 0s done:2s)
0:00:03 INF [lake_centerlines] -   write    1x(0% 0s done:2s)
0:00:03 INF [water_polygons] - 
0:00:03 INF [water_polygons] - Starting...
0:00:17 INF [water_polygons] -  read: [  244 100%   26/s ] write: [ 4.3M 475k/s ] 186M 
    cpus: 3.5 gc:  1% heap: 1.7G/4.2G direct: 54M postGC: 274M
    ->     (0/3) -> read( -%) ->    (0/1k) -> process( -%  -%  -%) ->   (0/54k) -> write( -%)
0:00:17 INF [water_polygons] - Finished in 14s cpu:37s avg:2.7
0:00:17 INF [water_polygons] -   read     1x(42% 6s done:7s)
0:00:17 INF [water_polygons] -   process  3x(35% 5s wait:3s done:5s)
0:00:17 INF [water_polygons] -   write    1x(4% 0.5s wait:9s done:5s)
0:00:17 INF [natural_earth] - 
0:00:17 INF [natural_earth] - Starting...
0:00:23 INF [natural_earth] -  read: [ 349k 100%  56k/s ] write: [  181   29/s ] 186M 
    cpus: 1.9 gc:  0% heap: 2.3G/4.2G direct: 54M postGC: 250M
    ->     (0/3) -> read( -%) ->    (0/1k) -> process( -%  -%  -%) ->   (0/54k) -> write( -%)
0:00:23 INF [natural_earth] - Finished in 6s cpu:12s avg:1.9
0:00:23 INF [natural_earth] -   read     1x(96% 6s)
0:00:23 INF [natural_earth] -   process  3x(16% 1s wait:6s)
0:00:23 INF [natural_earth] -   write    1x(0% 0s wait:6s)
0:00:23 INF [osm_pass1] - 
0:00:23 INF [osm_pass1] - Starting...
0:00:25 INF [osm_pass1:process] - Finished nodes: 4,761,785 (3.7M/s) in 1s cpu:4s avg:2.8
0:00:25 INF [osm_pass1:process] - Finished ways: 358,083 (810k/s) in 0.4s cpu:2s avg:3.8
0:00:25 INF [osm_pass1:process] - Finished relations: 6,089 (70k/s) in 0.1s cpu:0.3s avg:3.7
0:00:25 INF [osm_pass1] -  nodes: [ 4.7M 2.5M/s ] 491M  ways: [ 358k 193k/s ] rels: [   6k 3.2k/s ] blocks: [  642  347/s ]
    cpus: 3.1 gc:  0% heap: 3.2G/4.2G direct: 54M postGC: 664M hppc: 467k
    read( -%) ->     (0/7) -> parse( -%  -%) ->     (0/6) -> process( -%)
0:00:25 DEB [osm_pass1] - Processed 642 blocks:
0:00:25 DEB [osm_pass1] -   nodes: 4,761,785 (3.7M/s) in 1s cpu:4s avg:2.8
0:00:25 DEB [osm_pass1] -   ways: 358,083 (810k/s) in 0.4s cpu:2s avg:3.8
0:00:25 DEB [osm_pass1] -   relations: 6,089 (70k/s) in 0.1s cpu:0.3s avg:3.7
0:00:25 INF [osm_pass1] - Finished in 2s cpu:6s avg:3.1
0:00:25 INF [osm_pass1] -   read     1x(2% 0s wait:2s)
0:00:25 INF [osm_pass1] -   parse    2x(59% 1s)
0:00:25 INF [osm_pass1] -   process  1x(66% 1s)
0:00:25 INF [osm_pass2] - 
0:00:25 INF [osm_pass2] - Starting...
0:00:26 DEB [osm_pass2:process] - Sorting long long multimap...
0:00:26 INF [osm_pass2:process] - Finished nodes: 4,761,785 (3.9M/s) in 1s cpu:5s avg:3.9
0:00:26 DEB [osm_pass2:process] - Sorted long long multimap 0s cpu:0.1s avg:3.6
0:00:26 WAR [osm_pass2:process] - No GB polygon for inferring route network types
0:00:35 INF [osm_pass2] -  nodes: [ 4.7M 100% 476k/s ] 491M  ways: [ 316k  88%  31k/s ] rels: [    0   0%    0/s ] features: [ 5.3M 101k/s ] 1.6G  blocks: [  634  99%   63/s ]
    cpus: 3.5 gc:  2% heap: 2G/4.2G direct: 54M postGC: 1G relInfo: 441k mpGeoms: 18M  
    read( -%) ->    (5/14) -> process(85% 85% 88%) -> (1.3k/54k) -> write( 3%)
0:00:36 INF [osm_pass2:process] - Finished ways: 358,083 (38k/s) in 9s cpu:32s avg:3.5
0:00:40 INF [osm_pass2:process] - Finished relations: 6,089 (1.2k/s) in 5s cpu:16s avg:3.4
0:00:42 INF [osm_pass2] -  nodes: [ 4.7M 100%    0/s ] 491M  ways: [ 358k 100% 5.9k/s ] rels: [   6k 100%  875/s ] features: [ 5.4M  17k/s ] 278M  blocks: [  642 100%    1/s ]
    cpus: 3.3 gc:  1% heap: 2.1G/4.2G direct: 54M postGC: 1G relInfo: 441k mpGeoms: 18M  
    read( -%) ->    (0/14) -> process( -%  -%  -%) ->   (0/54k) -> write( -%)
0:00:42 DEB [osm_pass2] - Processed 642 blocks:
0:00:42 DEB [osm_pass2] -   nodes: 4,761,785 (3.9M/s) in 1s cpu:5s avg:3.9
0:00:42 DEB [osm_pass2] -   ways: 358,083 (38k/s) in 9s cpu:32s avg:3.5
0:00:42 DEB [osm_pass2] -   relations: 6,089 (1.2k/s) in 5s cpu:16s avg:3.4
0:00:42 INF [osm_pass2] - Finished in 17s cpu:59s avg:3.5
0:00:42 INF [osm_pass2] -   read     1x(0% 0s wait:9s done:8s)
0:00:42 INF [osm_pass2] -   process  3x(89% 15s)
0:00:42 INF [osm_pass2] -   write    1x(2% 0.3s wait:17s)
0:00:42 INF [boundaries] - 
0:00:42 INF [boundaries] - Starting...
0:00:42 INF [boundaries] - Creating polygons for 1 boundaries
0:00:42 WAR [boundaries] - Unable to form closed polygon for OSM relation 148838 (likely missing edges)
0:00:42 INF [boundaries] - Finished creating 0 country polygons
0:00:42 INF [boundaries] - Finished in 0s cpu:0s avg:2
0:00:42 INF [agg_stop] - 
0:00:42 INF [agg_stop] - Starting...
0:00:42 INF [agg_stop] - Processing 0 agg_stop sets
0:00:42 INF [agg_stop] - Finished in 0s cpu:0s avg:0
0:00:42 INF - Deleting node.db to make room for output file
0:00:42 INF [sort] - 
0:00:42 INF [sort] - Starting...
0:00:42 INF [sort] - Grouped 8 chunks into 1
0:00:44 INF [sort] -  chunks: [   1 /   1 100% ] 278M 
    cpus: 2.8 gc:  0% heap: 2.6G/4.2G direct: 54M postGC: 1G
    ->     (0/3) -> worker( -%)
0:00:44 INF [sort] - Finished in 1s cpu:4s avg:2.8
0:00:44 INF [sort] -   worker  1x(52% 0.7s)
0:00:44 INF - read:0s write:0s sort:0s
0:00:44 INF [archive] - 
0:00:44 INF [archive] - Starting...
0:00:44 DEB [archive] - Execute mbtiles: create table metadata (name text, value text);
0:00:44 DEB [archive] - Execute mbtiles: create unique index name on metadata (name);
0:00:44 DEB [archive] - 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:00:44 DEB [archive] - Execute mbtiles: create table tiles_data (
  tile_data_id integer primary key,
  tile_data blob
)

0:00:44 DEB [archive] - 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:00:46 INF [archive:write] - Starting z0
0:00:46 INF [archive:write] - Finished z0 in 0s cpu:0s avg:0, now starting z1
0:00:46 INF [archive:write] - Finished z1 in 0s cpu:0s avg:0, now starting z2
0:00:46 INF [archive:write] - Finished z2 in 0s cpu:0s avg:0, now starting z3
0:00:46 INF [archive:write] - Finished z3 in 0s cpu:0s avg:0, now starting z4
0:00:46 INF [archive:write] - Finished z4 in 0s cpu:0s avg:0, now starting z5
0:00:46 INF [archive:write] - Finished z5 in 0s cpu:0s avg:0, now starting z6
0:00:46 INF [archive:write] - Finished z6 in 0s cpu:0s avg:0, now starting z7
0:00:46 INF [archive:write] - Finished z7 in 0.1s cpu:0.3s avg:4, now starting z8
0:00:47 INF [archive:write] - Finished z8 in 0.8s cpu:3s avg:4, now starting z9
0:00:49 INF [archive:write] - Finished z9 in 2s cpu:7s avg:4, now starting z10
0:00:49 INF [archive:write] - Finished z10 in 0.1s cpu:0.4s avg:3.9, now starting z11
0:00:51 INF [archive:write] - Finished z11 in 2s cpu:6s avg:4, now starting z12
0:00:53 INF [archive:write] - Finished z12 in 2s cpu:9s avg:4, now starting z13
0:00:54 INF [archive] -  features: [ 781k  14%  78k/s ] 278M  tiles: [ 290k  29k/s ] 14M  
    cpus: 4 gc:  5% heap: 2.9G/4.2G direct: 54M postGC: 619M
    read( 1%) -> (212/219) -> encode(58% 60% 61% 62%) -> (215/216) -> write( 4%)
    last tile: 13/2469/3048 (z13 5%) https://onthegomap.github.io/planetiler-demo/#13.5/41.75492/-71.47705
0:00:58 INF [archive:write] - Finished z13 in 5s cpu:20s avg:4, now starting z14
0:01:02 DEB [archive:write] - Shallow tiles written: 4,115,013
0:01:02 DEB [archive:write] - Tile data written: 17,201 (100% omitted)
0:01:02 DEB [archive:write] - Unique tile hashes: 8,351
0:01:02 INF [archive:write] - Finished z14 in 4s cpu:11s avg:2.9
0:01:02 DEB [archive:write] - Set mbtiles metadata: bounds=-74.07,21.34,-17.84,43.55
0:01:02 DEB [archive:write] - Set mbtiles metadata: center=-45.955,32.445,3
0:01:02 DEB [archive:write] - Set mbtiles metadata: name=OpenMapTiles
0:01:02 DEB [archive:write] - Set mbtiles metadata: description=A tileset showcasing all layers in OpenMapTiles. https://openmaptiles.org
0:01:02 DEB [archive: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:02 DEB [archive:write] - Set mbtiles metadata: version=3.14.0
0:01:02 DEB [archive:write] - Set mbtiles metadata: type=baselayer
0:01:02 DEB [archive:write] - Set mbtiles metadata: format=pbf
0:01:02 DEB [archive:write] - Set mbtiles metadata: minzoom=0
0:01:02 DEB [archive:write] - Set mbtiles metadata: maxzoom=14
0:01:02 DEB [archive: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"},"minzoom":0,"maxzoom":14},{"id":"building","fields":{"colour":"String","render_height":"Number","render_min_height":"Number","hide_3d":"Boolean"},"minzoom":13,"maxzoom":14},{"id":"housenumber","fields":{"housenumber":"String"},"minzoom":14,"maxzoom":14},{"id":"landcover","fields":{"subclass":"String","class":"String"},"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","... 2465 more characters
0:01:02 DEB [archive:write] - Set mbtiles metadata: compression=gzip
0:01:02 DEB [archive:write] - Set mbtiles metadata: planetiler:version=0.7-SNAPSHOT
0:01:02 DEB [archive:write] - Set mbtiles metadata: planetiler:githash=adabc786eca75450ffa01e4b9506d96c2f517b09
0:01:02 DEB [archive:write] - Set mbtiles metadata: planetiler:buildtime=2024-01-02T22:30:56.277Z
0:01:02 DEB [archive:write] - Set mbtiles metadata: planetiler:osm:osmosisreplicationtime=2024-01-01T21:21:15Z
0:01:02 DEB [archive:write] - Set mbtiles metadata: planetiler:osm:osmosisreplicationseq=3929
0:01:02 DEB [archive:write] - Set mbtiles metadata: planetiler:osm:osmosisreplicationurl=http://download.geofabrik.de/north-america/us/rhode-island-updates
0:01:02 INF [archive] -  features: [ 5.4M 100% 633k/s ] 278M  tiles: [ 4.1M 517k/s ] 107M 
    cpus: 3.4 gc:  3% heap: 735M/4.2G direct: 54M postGC: 559M
    read( -%) ->   (0/219) -> encode( -%  -%  -%  -%) ->   (0/216) -> write(48%)
    last tile: 14/7380/5985 (z14 100%) https://onthegomap.github.io/planetiler-demo/#14.5/43.55651/-17.83081
0:01:02 DEB [archive] - Tile stats:
0:01:02 DEB [archive] - Biggest tiles (gzipped)
1. 14/4942/6092 (150k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.40015 (poi:72k)
2. 9/154/190 (148k) https://onthegomap.github.io/planetiler-demo/#9.5/41.77078/-71.36719 (landcover:85k)
3. 10/308/380 (137k) https://onthegomap.github.io/planetiler-demo/#10.5/41.90214/-71.54297 (landcover:66k)
4. 10/308/381 (136k) https://onthegomap.github.io/planetiler-demo/#10.5/41.63994/-71.54297 (landcover:72k)
5. 14/4941/6092 (108k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.42212 (poi:53k)
6. 14/4941/6093 (106k) https://onthegomap.github.io/planetiler-demo/#14.5/41.81227/-71.42212 (building:62k)
7. 11/616/762 (99k) https://onthegomap.github.io/planetiler-demo/#11.5/41.7057/-71.63086 (landcover:71k)
8. 14/4940/6092 (96k) https://onthegomap.github.io/planetiler-demo/#14.5/41.82864/-71.44409 (building:92k)
9. 11/616/761 (96k) https://onthegomap.github.io/planetiler-demo/#11.5/41.83679/-71.63086 (landcover:72k)
10. 14/4942/6091 (95k) https://onthegomap.github.io/planetiler-demo/#14.5/41.84501/-71.40015 (building:79k)
0:01:02 DEB [archive] - Max tile sizes
                      z0    z1    z2    z3    z4    z5    z6    z7    z8    z9   z10   z11   z12   z13   z14   all
           boundary  154   374   443   583   935   336   430   545   545  1.6k  2.1k  7.2k  6.4k  5.8k  4.5k  7.2k
              water 7.7k  3.7k  8.6k  5.5k  2.6k  5.1k   15k   18k   16k   25k   15k   13k   17k   15k   12k   25k
              place    0     0   441   441   441   650   739    1k  1.7k  3.4k  5.8k  3.2k  1.7k   797   947  5.8k
            landuse    0     0     0     0   548   619  1.3k  5.9k   17k   44k   59k   50k   38k   19k   12k   59k
     transportation    0     0     0     0   464   915  1.2k    6k    8k   24k   17k   19k   64k   47k   33k   64k
           waterway    0     0     0     0   111   118     0     0     0  3.2k  2.1k  2.1k  2.1k  4.9k  2.4k  4.9k
               park    0     0     0     0     0     0    1k  3.8k  9.7k   18k   13k  8.1k  4.3k  3.4k  4.4k   18k
transportation_name    0     0     0     0     0     0   359   454  1.2k  1.7k  5.4k  4.6k  3.8k  3.4k   18k   18k
          landcover    0     0     0     0     0     0     0  9.5k   29k   85k   72k   81k   53k   30k   24k   85k
      mountain_peak    0     0     0     0     0     0     0  1.1k  1.8k  3.4k  4.3k  2.8k  1.4k  1.4k   869  4.3k
         water_name    0     0     0     0     0     0     0     0     0   486   461   433   452  1.2k  1.5k  1.5k
    aerodrome_label    0     0     0     0     0     0     0     0     0     0   674   327   273   220   220   674
            aeroway    0     0     0     0     0     0     0     0     0     0  1.6k  2.1k    3k  3.4k  2.7k  3.4k
                poi    0     0     0     0     0     0     0     0     0     0     0     0   501   498   72k   72k
           building    0     0     0     0     0     0     0     0     0     0     0     0     0   59k   92k   92k
        housenumber    0     0     0     0     0     0     0     0     0     0     0     0     0     0   35k   35k
          full tile 7.9k    4k  9.5k  6.5k  3.8k  6.1k   20k   41k   84k  203k  184k  135k  113k  127k  232k  232k
            gzipped 6.2k  3.5k  7.1k  5.2k  3.1k  4.8k   13k   29k   60k  148k  137k   99k   83k   92k  150k  150k
0:01:02 DEB [archive] -    Max tile: 232k (gzipped: 150k)
0:01:02 DEB [archive] -    Avg tile: 5.4k (gzipped: 4k) using weighted average based on OSM traffic
0:01:02 DEB [archive] -     # tiles: 4,115,013
0:01:02 DEB [archive] -  # features: 5,462,060
0:01:02 INF [archive] - Finished in 18s cpu:1m6s avg:3.7
0:01:02 INF [archive] -   read    1x(3% 0.5s wait:17s)
0:01:02 INF [archive] -   encode  4x(56% 10s wait:2s)
0:01:02 INF [archive] -   write   1x(21% 4s wait:13s)
0:01:02 INF - Finished in 1m2s cpu:3m11s gc:1s avg:3.1
0:01:02 INF - FINISHED!
0:01:02 INF - 
0:01:02 INF - ----------------------------------------
0:01:02 INF - data errors:
0:01:02 INF - 	render_snap_fix_input	16,645
0:01:02 INF - 	osm_multipolygon_missing_way	74
0:01:02 INF - 	osm_boundary_missing_way	70
0:01:02 INF - 	merge_snap_fix_input	14
0:01:02 INF - 	feature_centroid_if_convex_osm_invalid_multipolygon_empty_after_fix	2
0:01:02 INF - 	feature_polygon_osm_invalid_multipolygon_empty_after_fix	2
0:01:02 INF - 	omt_park_area_osm_invalid_multipolygon_empty_after_fix	1
0:01:02 INF - ----------------------------------------
0:01:02 INF - 	overall          1m2s cpu:3m11s gc:1s avg:3.1
0:01:02 INF - 	lake_centerlines 3s cpu:6s avg:1.9
0:01:02 INF - 	  read     1x(15% 0.5s done:2s)
0:01:02 INF - 	  process  3x(0% 0s done:2s)
0:01:02 INF - 	  write    1x(0% 0s done:2s)
0:01:02 INF - 	water_polygons   14s cpu:37s avg:2.7
0:01:02 INF - 	  read     1x(42% 6s done:7s)
0:01:02 INF - 	  process  3x(35% 5s wait:3s done:5s)
0:01:02 INF - 	  write    1x(4% 0.5s wait:9s done:5s)
0:01:02 INF - 	natural_earth    6s cpu:12s avg:1.9
0:01:02 INF - 	  read     1x(96% 6s)
0:01:02 INF - 	  process  3x(16% 1s wait:6s)
0:01:02 INF - 	  write    1x(0% 0s wait:6s)
0:01:02 INF - 	osm_pass1        2s cpu:6s avg:3.1
0:01:02 INF - 	  read     1x(2% 0s wait:2s)
0:01:02 INF - 	  parse    2x(59% 1s)
0:01:02 INF - 	  process  1x(66% 1s)
0:01:02 INF - 	osm_pass2        17s cpu:59s avg:3.5
0:01:02 INF - 	  read     1x(0% 0s wait:9s done:8s)
0:01:02 INF - 	  process  3x(89% 15s)
0:01:02 INF - 	  write    1x(2% 0.3s wait:17s)
0:01:02 INF - 	boundaries       0s cpu:0s avg:2
0:01:02 INF - 	agg_stop         0s cpu:0s avg:0
0:01:02 INF - 	sort             1s cpu:4s avg:2.8
0:01:02 INF - 	  worker  1x(52% 0.7s)
0:01:02 INF - 	archive          18s cpu:1m6s avg:3.7
0:01:02 INF - 	  read    1x(3% 0.5s wait:17s)
0:01:02 INF - 	  encode  4x(56% 10s wait:2s)
0:01:02 INF - 	  write   1x(21% 4s wait:13s)
0:01:02 INF - ----------------------------------------
0:01:02 INF - 	archive	107MB
0:01:02 INF - 	features	278MB
-rw-r--r-- 1 runner docker 66M Jan  2 22:31 run.jar

@bbilger bbilger force-pushed the file-out branch 4 times, most recently from f1cf90e to 0acaca5 Compare December 20, 2023 21:48
Comment on lines 13 to 45
static Path relativePathFromTileCoord(TileCoord tc) {
return Paths.get(Integer.toString(tc.z()), Integer.toString(tc.x()),
tc.y() + PBF_FILE_ENDING);
}
Copy link
Contributor

@msbarry msbarry Dec 22, 2023

Choose a reason for hiding this comment

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

I wonder if the path format should be configurable? Or at least comparing to tilelive-copy, it has a "safe" mode that breaks x/y up into 2 levels so each directory has <1000 children.

https://github.com/mapbox/tilelive-file/blob/master/lib/tilelive-file.js#L40-L42

Copy link
Contributor Author

@bbilger bbilger Dec 23, 2023

Choose a reason for hiding this comment

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

Added support for custom "tile_scheme". Supported templates are {x}, {y}, {z} as well as {xs} and {ys} (s=safe). {xs} and {ys} are split into 2 levels.

{z}/{x}/{y}.pbf     => 3/1/2.pbf
{x}/{y}/{z}.pbf     => 1/2/3.pbf
{x}-{y}-{z}.pbf     => 1-2-3.pbf
{x}/a/{y}/b{z}.pbf  => 1/a/2/b3.pbf
{z}/{x}/{y}.pbf.gz  => 3/1/2.pbf.gz
{z}/{xs}/{ys}.pbf   => 3/000/001/000/002.pbf
{z}/{x}/{ys}.pbf    => 3/1/000/002.pbf
{z}/{xs}/{y}.pbf    => 3/000/001/2.pbf

2e4652e

Comment on lines 62 to 108
@Override
public TileArchiveMetadata metadata() {
return null;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

tilelive-file stores the metadata as metadata.json in the root of the archive - could we do the same 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.

done

did a bunch of refactorings to the (de-)serialization of TileArchiveMetadata

d238a4f

}
lastCheckedFolder = folder;
try {
Files.write(file, encodingResult.tileData());
Copy link
Contributor

Choose a reason for hiding this comment

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

encodingResult.tileData() is gzipped here. We should probably make it configurable whether or not the output files should be gzipped (I think default to false?). If they aren't gzipped we can skip the gzip step while encoding, and if they are gzipped the output extension should probably be .pbf.gz

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 output is not necessarily gzipped. This is already configurable at a higher level: tile_compression. So I don't think anything needs to be handled here specifically at the archive level.

Copy link
Contributor

Choose a reason for hiding this comment

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

Ahh right I forgot that was there... I wonder if when tile compression is gzip if it should add .gz suffix or if it's better for tiles to be at known locations on disk?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I personally prefer the tiles to be at a known location by default. With the introduction of the tile_scheme param users can adjust as needed.
2e4652e

@msbarry
Copy link
Contributor

msbarry commented Dec 22, 2023

Regarding performance, this is definitely going to be slower than a single-file archive but I wonder if there's any performance difference to Files.write from multiple OS threads vs. Files.write from virtual threads vs. something like AsynchronousFileChannel (or others?).

These could also be separate followup issues, but I noticed:

  • when there are multiple writer threads with --tile_write_threads=5 they each print Finished z11 ... now starting z12, call tileWriter.printStats() and call archive.finish() - maybe there should be a different way to handle those? Or only do the logging from thread 0 or something?
  • FileUtils.size looks like a bottleneck because the ProgressLoggers calls it while printing status during the archive write phase, and Stats calls it at the end to print a file size summary. Might make sense to either disable (have the method give up a certain number of files or for a certain amount of time) or keep a counter of bytes written to the output directory instead of having to scan it each time?

@bbilger
Copy link
Contributor Author

bbilger commented Dec 23, 2023

These could also be separate followup issues, but I noticed:

  • when there are multiple writer threads with --tile_write_threads=5 they each print Finished z11 ... now starting z12, call tileWriter.printStats() and call archive.finish() - maybe there should be a different way to handle those? Or only do the logging from thread 0 or something?
  • FileUtils.size looks like a bottleneck because the ProgressLoggers calls it while printing status during the archive write phase, and Stats calls it at the end to print a file size summary. Might make sense to either disable (have the method give up a certain number of files or for a certain amount of time) or keep a counter of bytes written to the output directory instead of having to scan it each time?

Addressed those points here: 5371520

  1. archive.finish() being called for each writer was definitely a bug - it's now called after ALL writers finished
  2. Finished z11 ... now starting z12 - logging for the first writer only - not 100% accurate but should be good enough for some "zoom-progress logging"
  3. tileWriter.printStats() think that's ok that we print stats for each writer as long as they are writer specific. I introduced printStats on WriteableTilesArchive now for archive related logging.
  4. FileUtils.size in ProgressLoggers was definitely an issue. I introduced WriteableTilesArchive#bytesWritten in order to handle that correctly (was also an issue for the stream writers).

@bbilger
Copy link
Contributor Author

bbilger commented Dec 23, 2023

Regarding performance, this is definitely going to be slower than a single-file archive but I wonder if there's any performance difference to Files.write from multiple OS threads vs. Files.write from virtual threads vs. something like AsynchronousFileChannel (or others?).

Good question/point. Need to investigate a bit on this.

@bbilger bbilger force-pushed the file-out branch 4 times, most recently from 7fc6f64 to b8cfa56 Compare December 24, 2023 17:19
@bbilger
Copy link
Contributor Author

bbilger commented Dec 24, 2023

regarding performance: I wrote some benchmark (BenchmarkTileFilesWrites) that loads a mbtiles file into memory and then writes the tiles to files in different modes.

See the benchmark results below from my machine for US (0<=z<=13). If I interpret things correctly, then there's no real benefit for virtual threads. At the same time async seems to be good compromise between absolute and CPU time.

So I impletemented:

  1. async file writing for the files archive with the option to write sync.
  2. a way to use virtual threads (bound only) for the tile writers (--tile_write_threads=100 --tile_write_executor=virtual) - in case you want to experiment with it

If you agree, then I'd remove the benchmark as well as the option to use virtual threads for writing, again.

mode run duration
fixed1 0 4m34s cpu:4m25s gc:1s avg:1
fixed1 1 4m20s cpu:4m21s gc:2s avg:1
fixed2 0 3m12s cpu:5m56s avg:1.9
fixed2 1 2m54s cpu:5m43s avg:2
fixed4 0 2m55s cpu:11m2s avg:3.8
fixed4 1 2m56s cpu:11m2s avg:3.8
fixed10Virtual 0 3m18s cpu:22m21s avg:6.8
fixed10Virtual 1 3m19s cpu:22m30s avg:6.8
fixed100Virtual 0 3m30s cpu:30m14s gc:1s avg:8.6
fixed100Virtual 1 3m33s cpu:30m32s avg:8.6
fixed1000Virtual 0 3m42s cpu:33m47s gc:1s avg:9.1
fixed1000Virtual 1 3m46s cpu:33m56s avg:9
async 0 3m53s cpu:6m56s avg:1.8
async 1 3m54s cpu:7m13s avg:1.8
unboundVirtual 0 4m29s cpu:19m42s gc:3s avg:4.4
unboundVirtual 1 4m37s cpu:20m34s gc:3s avg:4.5

changes are here: b8cfa56

@msbarry
Copy link
Contributor

msbarry commented Dec 30, 2023

regarding performance: I wrote some benchmark (BenchmarkTileFilesWrites) that loads a mbtiles file into memory and then writes the tiles to files in different modes.

See the benchmark results below from my machine for US (0<=z<=13). If I interpret things correctly, then there's no real benefit for virtual threads. At the same time async seems to be good compromise between absolute and CPU time.

So I impletemented:

  1. async file writing for the files archive with the option to write sync.
  2. a way to use virtual threads (bound only) for the tile writers (--tile_write_threads=100 --tile_write_executor=virtual) - in case you want to experiment with it

If you agree, then I'd remove the benchmark as well as the option to use virtual threads for writing, again.

mode run duration
fixed1 0 4m34s cpu:4m25s gc:1s avg:1
fixed1 1 4m20s cpu:4m21s gc:2s avg:1
fixed2 0 3m12s cpu:5m56s avg:1.9
fixed2 1 2m54s cpu:5m43s avg:2
fixed4 0 2m55s cpu:11m2s avg:3.8
fixed4 1 2m56s cpu:11m2s avg:3.8
fixed10Virtual 0 3m18s cpu:22m21s avg:6.8
fixed10Virtual 1 3m19s cpu:22m30s avg:6.8
fixed100Virtual 0 3m30s cpu:30m14s gc:1s avg:8.6
fixed100Virtual 1 3m33s cpu:30m32s avg:8.6
fixed1000Virtual 0 3m42s cpu:33m47s gc:1s avg:9.1
fixed1000Virtual 1 3m46s cpu:33m56s avg:9
async 0 3m53s cpu:6m56s avg:1.8
async 1 3m54s cpu:7m13s avg:1.8
unboundVirtual 0 4m29s cpu:19m42s gc:3s avg:4.4
unboundVirtual 1 4m37s cpu:20m34s gc:3s avg:4.5
changes are here: b8cfa56

Thanks for doing those tests! I saw similar results running this on a linux box with fast SSD - fastest seemed to be with 4 dedicated OS threads.

Given these results, can we just remove the extra code paths and keep the configurable number of fixed threads you had initially since it's the fastest and simplest?

Copy link
Contributor

@msbarry msbarry left a comment

Choose a reason for hiding this comment

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

Thanks for making these changes! I'm trying to test it with the custom schemes but getting some errors:

My first attempt was to use --output=tiles/{z}/{x}-{y}.pbf.gz - it would be cool if that worked but looks like it's not currently handled.

Then I tried --output=tiles?format=files&tile_scheme={z}/{x}/{y}.pbf.gz but I get Illegal character in query at index 31: tiles?format=files&tile_scheme={z}/{x}/{y}.pbf.gz.

To make it work I had to do --output=tiles&format=files&tile_scheme=%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf.gz which isn't super user-friendly.

Is there another way that I'm missing?

Comment on lines 341 to 344
final boolean firstTileWriter = firstTileWriterTracker.compareAndExchange(true, false);
if (firstTileWriter) {
archive.initialize();
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Can we pull this out to run before the tile writers start like you did with finish archive? Just to make sure there's no race condition with other threads getting to the tile writing before initialize has finished?

Copy link
Contributor Author

@bbilger bbilger Dec 30, 2023

Choose a reason for hiding this comment

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

Good point, was thinking about it as well but thought not very likely.
Didn't find any good spot to move it to. I moved it here now:


Let me know if you have a better idea.

@@ -371,8 +387,6 @@ private void tileWriter(Iterable<TileBatch> tileBatches) throws ExecutionExcepti
if (time != null) {
Copy link
Contributor

Choose a reason for hiding this comment

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

can you remove printStats above now that it happens in finishArchive?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I am not quite sure what you mean here, sorry

Copy link
Contributor

Choose a reason for hiding this comment

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

Ah sorry I meant the tileWriter.printStats(); line - but I see now that's separate from archive.printStats(); It looks like nothing overrides archive.printStats() - might just be best to remove it?

@@ -44,6 +44,10 @@ default void initialize() {}
*/
default void finish(TileArchiveMetadata tileArchiveMetadata) {}

default void printStats() {}
Copy link
Contributor

Choose a reason for hiding this comment

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

Should we get rid of TileWriter printStats as well?

Copy link
Contributor Author

@bbilger bbilger Dec 30, 2023

Choose a reason for hiding this comment

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

I think there's still a point in having printStats for a writer. And there's one usage


Moving that to the archive's printStats feels strange. But we for sure could if you want, or log from #close in that specific case.

@@ -44,6 +44,10 @@ default void initialize() {}
*/
default void finish(TileArchiveMetadata tileArchiveMetadata) {}

default void printStats() {}

long bytesWritten();
Copy link
Contributor

Choose a reason for hiding this comment

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

Thanks for adding this, I could do this in a separate PR as well but there's one remaining place where it gets the size of the archive which could take a very long time if you just wrote tiles for the planet: Stats.printSummary - ideally it either uses the same output from this method, or we add a failsafe to FileUtils.size that gives up after a certain number of files/time since that output duplicates what got printed earlier we won't miss much.

Copy link
Contributor Author

@bbilger bbilger Dec 30, 2023

Choose a reason for hiding this comment

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

done: 323f4c1

@bbilger
Copy link
Contributor Author

bbilger commented Dec 30, 2023

Thanks for making these changes! I'm trying to test it with the custom schemes but getting some errors:

My first attempt was to use --output=tiles/{z}/{x}-{y}.pbf.gz - it would be cool if that worked but looks like it's not currently handled.

Then I tried --output=tiles?format=files&tile_scheme={z}/{x}/{y}.pbf.gz but I get Illegal character in query at index 31: tiles?format=files&tile_scheme={z}/{x}/{y}.pbf.gz.

To make it work I had to do --output=tiles&format=files&tile_scheme=%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf.gz which isn't super user-friendly.

Is there another way that I'm missing?

The other option - which I always use - is to use format pre-fixed args => --output=tiles/ --files_tile_scheme={x}/{y}/{z}.pbf

I'll check if we can support your other approaches.

@msbarry
Copy link
Contributor

msbarry commented Dec 30, 2023

Thanks for making these changes! I'm trying to test it with the custom schemes but getting some errors:
My first attempt was to use --output=tiles/{z}/{x}-{y}.pbf.gz - it would be cool if that worked but looks like it's not currently handled.
Then I tried --output=tiles?format=files&tile_scheme={z}/{x}/{y}.pbf.gz but I get Illegal character in query at index 31: tiles?format=files&tile_scheme={z}/{x}/{y}.pbf.gz.
To make it work I had to do --output=tiles&format=files&tile_scheme=%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf.gz which isn't super user-friendly.
Is there another way that I'm missing?

The other option - which I always use - is to use format pre-fixed args => --output=tiles/ --files_tile_scheme={x}/{y}/{z}.pbf

I'll check if we can support your other approaches.

Ah got it, that makes sense. Could we add a short javadoc to the major new classes (don't worry about all of them, the helper classes should be self-explanatory without any javadoc) and maybe include that cli arg snippet in the javadoc for readable/writeable files archive classes?

The shorthand one would be a nice to have, but might be hard to disambiguate between that and writing to a file archive on disk?

i.e. write individual pbf-files to disk in the format <base>/z/x/y.pbf

in order to use that format it must be passed as "--ouput=/path/to/tiles?format=files"

Fixes onthegomap#536
...if no explict format query param given, path ends with a slash, or no extension given
and refactor TileArchiveMetadata
1. put zoom into center (CoordinateXY->Coordinate) - in sync with mbtiles-format
2. add (De-)Serializer for Coordinate+Envelop => avoid duplication and cleaner
3. change the json and proto output for TileArchiveMetadata to be (more) in sync with mbtiles-format
{z}/{x}/{y}.pbf is the default and can be configured as needed - e.g.:
- different order: {x}/{y}/{z}.pbf
- with intermediate dirs: {x}/a/{y}/b/{z}.pbf
- with different extension: {z}/{y}/{y}.pbf.gz

instead of {x} and {y}, {xs} and {xy} can be used which breaks up
x and y into 2 directories each and ensures that each directory has <1000 children
1. call finish archive only once after all writers are finished
   ...and not every time a writer finishes
2. log "zoom-progress" for the first tile write only
   (Finished z11 ... now starting z12)
3. remove file/dir-size progress logger bottleneck for files archive
   => each archive now reports the bytes written, which also fixes
   the issues of stream-archives reporting the size incorrectly
4. introduce printStats-hook on archive-level
...allow to use virtual threads ExecturService (bound only!) for tile writing

also add some benchmark for writing tiles to disk: fixed, bound virtual, async, unbound virtual
- extract TileSchemeEncoding
- use Counter.MultithreadCounter rather than LongAdder to count bytes written
- add some JavaDoc
1. allow to pass tile scheme directly via output: --output=tiles/{x}/{y}/{z}.pbf
2. auto-encode { (%7B) and } (%7D) => no need to encode it the URI on CLI
@bbilger bbilger force-pushed the file-out branch 3 times, most recently from c41b953 to 4fa3ed2 Compare December 30, 2023 22:41
@bbilger
Copy link
Contributor Author

bbilger commented Dec 30, 2023

Thanks for making these changes! I'm trying to test it with the custom schemes but getting some errors:
My first attempt was to use --output=tiles/{z}/{x}-{y}.pbf.gz - it would be cool if that worked but looks like it's not currently handled.
Then I tried --output=tiles?format=files&tile_scheme={z}/{x}/{y}.pbf.gz but I get Illegal character in query at index 31: tiles?format=files&tile_scheme={z}/{x}/{y}.pbf.gz.
To make it work I had to do --output=tiles&format=files&tile_scheme=%7Bz%7D%2F%7Bx%7D%2F%7By%7D.pbf.gz which isn't super user-friendly.
Is there another way that I'm missing?

The other option - which I always use - is to use format pre-fixed args => --output=tiles/ --files_tile_scheme={x}/{y}/{z}.pbf
I'll check if we can support your other approaches.

Ah got it, that makes sense. Could we add a short javadoc to the major new classes (don't worry about all of them, the helper classes should be self-explanatory without any javadoc) and maybe include that cli arg snippet in the javadoc for readable/writeable files archive classes?

The shorthand one would be a nice to have, but might be hard to disambiguate between that and writing to a file archive on disk?

I added support for those shortcuts here: 7d0bc26
Detecting it is rather simple by the templates ({) - which otherwise should not really be used, and even if so users can pass the format-query param to enforce some format.

I also added javadoc where I thought it makes sense but let me know if you want more.

1. use WriteableTileArchive#bytesWritten in summmary as well
2. call WriteableTileArchive#init in a safer manner

..and a few more adjustments
Copy link
Contributor

@msbarry msbarry left a comment

Choose a reason for hiding this comment

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

Thanks for making those changes, it's looking good, a couple of minor comments...

@@ -371,8 +387,6 @@ private void tileWriter(Iterable<TileBatch> tileBatches) throws ExecutionExcepti
if (time != null) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Ah sorry I meant the tileWriter.printStats(); line - but I see now that's separate from archive.printStats(); It looks like nothing overrides archive.printStats() - might just be best to remove it?

Copy link

sonarqubecloud bot commented Jan 2, 2024

@bbilger
Copy link
Contributor Author

bbilger commented Jan 2, 2024

Should be all set now. Let me know if there's anything else.

Copy link
Contributor

@msbarry msbarry left a comment

Choose a reason for hiding this comment

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

Looks great, thank you!!

@msbarry msbarry merged commit c480b35 into onthegomap:main Jan 3, 2024
12 checks passed
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] New output archive type for individual files
2 participants