use super::manager::MemoryResourceManager;
use super::types::AccessPatternHint;
use crate::backend::native::graph_file::buffers::ReadBuffer;
impl<'a> MemoryResourceManager<'a> {
pub fn optimize_buffers(&mut self, pattern_hint: AccessPatternHint) {
match pattern_hint {
AccessPatternHint::Sequential => {
let optimal_capacity = ReadBuffer::adaptive_capacity(8192);
if optimal_capacity != self.read_buffer.capacity {
*self.read_buffer = ReadBuffer::with_capacity(optimal_capacity);
}
}
AccessPatternHint::Random => {
let optimal_capacity = ReadBuffer::adaptive_capacity(256);
if optimal_capacity != self.read_buffer.capacity {
*self.read_buffer = ReadBuffer::with_capacity(optimal_capacity);
}
}
AccessPatternHint::Mixed => {
let optimal_capacity = ReadBuffer::adaptive_capacity(512);
if optimal_capacity != self.read_buffer.capacity {
*self.read_buffer = ReadBuffer::with_capacity(optimal_capacity);
}
}
}
}
pub fn analyze_access_patterns(&self) -> AccessPatternHint {
if self.write_buffer.operations.len() > 10 {
AccessPatternHint::Random } else if self.write_buffer.operations.len() > 2 {
AccessPatternHint::Mixed
} else {
AccessPatternHint::Sequential
}
}
pub fn auto_optimize(&mut self) {
let detected_pattern = self.analyze_access_patterns();
self.optimize_buffers(detected_pattern);
}
pub fn optimal_buffer_size_for_workload(&self, workload_type: &str) -> usize {
match workload_type {
"bulk_import" | "sequential_scan" => 8192,
"random_access" | "oltp" => 256,
"mixed_workload" | "default" => 512,
_ => 512, }
}
pub fn memory_efficiency_score(&self) -> f32 {
let buffer_utilization = if self.read_buffer.capacity > 0 {
self.read_buffer.size as f32 / self.read_buffer.capacity as f32
} else {
0.0
};
let write_buffer_efficiency = if self.write_buffer.capacity > 0 {
self.write_buffer.operations.len() as f32 / self.write_buffer.capacity as f32
} else {
0.0
};
(buffer_utilization + write_buffer_efficiency) / 2.0
}
pub fn adaptive_capacity_management(&mut self) {
let efficiency = self.memory_efficiency_score();
if efficiency < 0.3 {
let new_capacity = std::cmp::max(
self.read_buffer.capacity / 2,
ReadBuffer::adaptive_capacity(256),
);
if new_capacity != self.read_buffer.capacity {
*self.read_buffer = ReadBuffer::with_capacity(new_capacity);
}
} else if efficiency > 0.9 {
let new_capacity = std::cmp::min(
self.read_buffer.capacity * 2,
ReadBuffer::adaptive_capacity(8192),
);
if new_capacity != self.read_buffer.capacity {
*self.read_buffer = ReadBuffer::with_capacity(new_capacity);
}
}
}
}