Skip to content

Commit b5510ac

Browse files
committed
feat(writer): optimize tile encoding in pmtiles writer with parallel processing
1 parent 7d1d8b8 commit b5510ac

1 file changed

Lines changed: 15 additions & 2 deletions

File tree

  • versatiles_container/src/container/pmtiles

versatiles_container/src/container/pmtiles/writer.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff 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)?)?;

0 commit comments

Comments
 (0)