From 75df916d97d9eb6380083c022b0fe4c8ecfa26c9 Mon Sep 17 00:00:00 2001 From: Stanislav Pastushenko Date: Tue, 2 Dec 2025 19:32:31 +0100 Subject: [PATCH] memory optimisation --- src/search.rs | 7 ++----- src/types.rs | 3 ++- src/ui/log_view.rs | 10 ++++++++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/search.rs b/src/search.rs index d97063d..a849d35 100644 --- a/src/search.rs +++ b/src/search.rs @@ -141,13 +141,10 @@ fn search_lines( // Read lines in this chunk efficiently (one seek, sequential reads) let lines = line_index.read_line_range(&mut file_handle, *start, *end); - // Process each line + // Process each line - only store line numbers, not content for (line_number, content) in lines { if params.matches_line(&content, ®ex_matcher) { - chunk_results.push(FilteredLine { - line_number, - content, - }); + chunk_results.push(FilteredLine { line_number }); } } diff --git a/src/types.rs b/src/types.rs index 2a9bc56..2362430 100644 --- a/src/types.rs +++ b/src/types.rs @@ -7,8 +7,9 @@ pub struct HighlightRule { pub enabled: bool, } +// Filtered lines now only store line numbers to save memory +// Content is loaded on-demand when rendering #[derive(Clone)] pub struct FilteredLine { pub line_number: usize, - pub content: String, } diff --git a/src/ui/log_view.rs b/src/ui/log_view.rs index 09dc38a..ce17d2a 100644 --- a/src/ui/log_view.rs +++ b/src/ui/log_view.rs @@ -161,15 +161,21 @@ fn render_visible_lines( fn get_line_content(tab: &mut FileTab, show_all: bool, display_idx: usize) -> (usize, String) { if show_all { + // Main view: read line by display index let content = tab .line_index .read_line(&mut tab.file_handle, display_idx) .unwrap_or_default(); (display_idx, content) } else { + // Filtered view: get line number from filtered list, then read content on-demand if display_idx < tab.filtered_lines.len() { - let filtered = &tab.filtered_lines[display_idx]; - (filtered.line_number, filtered.content.clone()) + let line_number = tab.filtered_lines[display_idx].line_number; + let content = tab + .line_index + .read_line(&mut tab.file_handle, line_number) + .unwrap_or_default(); + (line_number, content) } else { (0, String::new()) }