From 66be33b3a72aceaf1e7227de66138fc21afcec1f Mon Sep 17 00:00:00 2001 From: Paul Nodet <5941125+pnodet@users.noreply.github.com> Date: Sat, 4 Jul 2026 01:12:04 +0200 Subject: [PATCH] fix: stream points instead of buffering the whole cloud in memory The las Writer clears the header it receives and recomputes point counts, per-return counts, and bounds itself on write/close, so the manual header.add_point pass was dead work and the Vec buffer only existed to support it. Stream read->write in one pass for constant memory usage. Co-Authored-By: Claude Fable 5 --- src/main.rs | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/src/main.rs b/src/main.rs index a20c675..d046736 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use anyhow::{Context, Result}; use clap::Parser; -use las::{Builder, Read, Reader, Write, Writer}; +use las::{Read, Reader, Write, Writer}; #[derive(Parser)] #[command(author, version, about, long_about = None)] @@ -15,32 +15,17 @@ struct Args { fn main() -> Result<()> { let args = Args::parse(); - let mut reader = Reader::from_path(args.path).context("Failed to open las file")?; - - let original_header = reader.header().clone(); - - let mut header = Builder::from(original_header).into_header()?; - - let mut las_points: Vec = Vec::new(); + let mut reader = Reader::from_path(&args.path).context("Failed to open las file")?; + let header = reader.header().clone(); + let mut writer = Writer::from_path(&args.output, header).context("Failed to create las writer")?; for point in reader.points() { match point { - Ok(point) => { - header.add_point(&point); - las_points.push(point); - } - Err(_) => { - continue; - } + Ok(point) => writer.write(point).context("Failed to write point")?, + Err(_) => continue, } } - let mut writer = Writer::from_path(args.output, header).context("Failed to get las writer")?; - - for point in las_points { - writer.write(point).context("Unable to write:")?; - } - writer.close().context("Failed to close las writer")?; Ok(())