use crate::error::Result;
use crate::fast_writer::UltraLowMemoryWorkbook;
use std::path::Path;
#[derive(Debug, Clone, Copy)]
pub enum MemoryProfile {
Low,
Medium,
High,
Custom {
flush_interval: u32,
max_buffer_size: usize,
},
}
impl MemoryProfile {
pub fn from_memory_mb(memory_mb: usize) -> Self {
if memory_mb < 512 {
MemoryProfile::Low
} else if memory_mb < 1024 {
MemoryProfile::Medium
} else {
MemoryProfile::High
}
}
pub fn from_env() -> Self {
std::env::var("MEMORY_LIMIT_MB")
.ok()
.and_then(|s| s.parse::<usize>().ok())
.map(Self::from_memory_mb)
.unwrap_or(MemoryProfile::High)
}
fn apply(&self, _workbook: &mut UltraLowMemoryWorkbook) {
match self {
MemoryProfile::Low => {
}
MemoryProfile::Medium => {
}
MemoryProfile::High => {
}
MemoryProfile::Custom { .. } => {
}
}
}
}
pub fn create_workbook_auto<P: AsRef<Path>>(path: P) -> Result<UltraLowMemoryWorkbook> {
let profile = MemoryProfile::from_env();
create_workbook_with_profile(path, profile)
}
pub fn create_workbook_with_profile<P: AsRef<Path>>(
path: P,
profile: MemoryProfile,
) -> Result<UltraLowMemoryWorkbook> {
let mut workbook = UltraLowMemoryWorkbook::new(path)?;
profile.apply(&mut workbook);
Ok(workbook)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_memory_profile_from_mb() {
assert!(matches!(
MemoryProfile::from_memory_mb(256),
MemoryProfile::Low
));
assert!(matches!(
MemoryProfile::from_memory_mb(768),
MemoryProfile::Medium
));
assert!(matches!(
MemoryProfile::from_memory_mb(2048),
MemoryProfile::High
));
}
}