sunchao commented on code in PR #5042:
URL: https://github.com/apache/datafusion-comet/pull/5042#discussion_r3837586414


##########
native/spark-expr/src/string_funcs/levenshtein.rs:
##########
@@ -26,67 +26,188 @@ use datafusion::common::{cast::as_generic_string_array, 
DataFusionError, Result}
 use datafusion::physical_plan::ColumnarValue;
 use std::sync::Arc;
 
+// Thread-local scratch buffers to avoid heap allocations in the row 
processing loop
+thread_local! {
+    static LEVENSHTEIN_SCRATCH: std::cell::RefCell<(Vec<i32>, Vec<i32>)> =
+        std::cell::RefCell::new((Vec::with_capacity(64), 
Vec::with_capacity(64)));

Review Comment:
   [P2] Bound the retained capacity of the scratch vectors
   
   Could you cap the cached capacity or keep these buffers at batch/task scope? 
`Vec::resize` reduces the length but never releases capacity, so moving the 
vectors into TLS retains the largest allocation until the worker thread exits, 
including after the query finishes. I ran the exact-head kernels with two equal 
16,000,000-character ASCII strings and threshold 0, then dropped the input and 
evaluated a one-character pair. The two vectors still retained 128,000,008 
bytes after that small call. These are valid inputs and the thresholded case 
completes in linear time. Comet's long-lived worker threads can therefore 
retain this allocation independently, outside the query memory pool. The 
previous call-local vectors released it on return.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to