use sysinfo::System;
#[derive(Debug, Clone, Default)]
pub enum ChunkSize {
Fixed(usize),
#[default]
Adaptive,
Custom(fn(u64) -> usize),
}
impl ChunkSize {
pub fn calculate(&self, file_size_bytes: u64) -> usize {
match self {
ChunkSize::Fixed(size) => *size,
ChunkSize::Adaptive => self.adaptive_size(file_size_bytes),
ChunkSize::Custom(func) => func(file_size_bytes),
}
}
fn adaptive_size(&self, file_size_bytes: u64) -> usize {
let mut system = System::new_all();
system.refresh_memory();
let available_memory = system.available_memory();
let memory_per_chunk = (available_memory / 10).max(64 * 1024 * 1024);
let estimated_row_size = 1024;
let rows_per_chunk = (memory_per_chunk / estimated_row_size) as usize;
let file_size_mb = file_size_bytes / (1024 * 1024);
if file_size_mb < 100 {
rows_per_chunk * 10
} else if file_size_mb > 10_000 {
rows_per_chunk / 2
} else {
rows_per_chunk
}
}
}