File tree Expand file tree Collapse file tree
versatiles_container/src/container/pmtiles Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -111,10 +111,23 @@ impl TilesWriter for PMTilesWriter {
111111 let writer_mutex = Arc :: clone ( & writer_mutex) ;
112112 let entries_mutex = Arc :: clone ( & entries_mutex) ;
113113 Box :: pin ( async move {
114+ // Pre-encode blobs in parallel (CPU-intensive work happens here)
115+ let stream = stream. map_parallel_try ( move |_coord, mut tile| {
116+ tile. as_blob ( tile_compression) ?;
117+ Ok ( tile)
118+ } ) ;
119+
120+ // Collect results, propagating encoding errors
121+ let mut tiles = Vec :: new ( ) ;
122+ for ( coord, result) in stream. to_vec ( ) . await {
123+ tiles. push ( ( coord, result?) ) ;
124+ }
125+
126+ tiles. sort_by_key ( |( coord, _) | coord. get_hilbert_index ( ) . unwrap ( ) ) ;
127+
128+ // Lock AFTER parallel work — write is cheap (blobs already encoded)
114129 let mut writer = writer_mutex. lock ( ) . await ;
115130 let mut entries = entries_mutex. lock ( ) . await ;
116- let mut tiles = stream. to_vec ( ) . await ;
117- tiles. sort_by_key ( |( coord, _) | coord. get_hilbert_index ( ) . unwrap ( ) ) ;
118131 for ( coord, mut tile) in tiles {
119132 let id = coord. get_hilbert_index ( ) ?;
120133 let range = writer. append ( tile. as_blob ( tile_compression) ?) ?;
You can’t perform that action at this time.
0 commit comments