use std::io::Write;
use crate::error::IndexError;
use crate::storage::PermutationStorage;
pub(crate) const MMAP_THRESHOLD: u64 = 50_000_000;
pub(crate) fn write_mmap(ids: &[u32]) -> Result<PermutationStorage, IndexError> {
let mut file = tempfile::NamedTempFile::new().map_err(IndexError::MmapError)?;
{
let mut writer = std::io::BufWriter::new(file.as_file_mut());
for &id in ids {
writer
.write_all(&id.to_le_bytes())
.map_err(IndexError::MmapError)?;
}
writer.flush().map_err(IndexError::MmapError)?;
}
#[allow(unsafe_code)]
let map = unsafe {
memmap2::MmapOptions::new()
.map(file.as_file())
.map_err(IndexError::MmapError)?
};
tracing::info!(
rows = ids.len(),
"created memory-mapped permutation storage"
);
Ok(PermutationStorage::Mmap {
map,
len: ids.len(),
_file: file,
})
}