vec: make collect_range use into_iter

This commit is contained in:
nym21
2025-04-27 10:39:14 +02:00
parent bdc3c19163
commit 1e38c21f8e
4 changed files with 21 additions and 30 deletions

View File

@@ -75,3 +75,4 @@ Stores: `src/storage/stores/mod.rs`
- mode: `raw` - mode: `raw`
- disk usage: `208 GB` - disk usage: `208 GB`
- overhead: `28%` (`208 GB / 744 GB`) - overhead: `28%` (`208 GB / 744 GB`)
- peak memory: `5.7GB`

View File

@@ -10,7 +10,6 @@ use axum::{
response::{IntoResponse, Response}, response::{IntoResponse, Response},
}; };
use memmap2::Mmap; use memmap2::Mmap;
use serde_json::Value;
use crate::{Error, Result, Version}; use crate::{Error, Result, Version};
@@ -161,7 +160,11 @@ where
} }
#[inline] #[inline]
fn collect_range_serde_json(&self, from: Option<i64>, to: Option<i64>) -> Result<Vec<Value>> { fn collect_range_serde_json(
&self,
from: Option<i64>,
to: Option<i64>,
) -> Result<Vec<serde_json::Value>> {
self.collect_signed_range(from, to)? self.collect_signed_range(from, to)?
.into_iter() .into_iter()
.map(|v| serde_json::to_value(v).map_err(Error::from)) .map(|v| serde_json::to_value(v).map_err(Error::from))

View File

@@ -324,30 +324,21 @@ where
}) })
} }
fn collect_range(&self, from: Option<usize>, to: Option<usize>) -> Result<Vec<Self::T>> { fn collect_range(&self, from: Option<usize>, to: Option<usize>) -> Result<Vec<T>> {
if !self.is_pushed_empty() {
return Err(Error::UnsupportedUnflushedState);
}
let stored_len = self.stored_len(); let stored_len = self.stored_len();
let from = from.unwrap_or_default(); let from = from.unwrap_or_default();
let to = to.map_or(stored_len, |i| i.min(stored_len)); let to = to.map_or(stored_len, |i| i.min(stored_len));
if from >= stored_len { if from >= stored_len || from >= to {
return Ok(vec![]); return Ok(vec![]);
} }
let mmap = self.mmap().load(); Ok(self
let pages_meta = self.pages_meta.load(); .into_iter()
let mut decoded_page: Option<(usize, Vec<T>)> = None; .skip(from)
.take(to - from)
(from..to) .map(|(_, v)| v.into_inner())
.map(|index| { .collect::<Vec<_>>())
Self::cached_get_stored__(index, &mmap, stored_len, &mut decoded_page, &pages_meta)
.map(|opt| opt.unwrap())
})
.collect::<Result<Vec<_>>>()
} }
fn flush(&mut self) -> Result<()> { fn flush(&mut self) -> Result<()> {

View File

@@ -152,24 +152,20 @@ where
} }
fn collect_range(&self, from: Option<usize>, to: Option<usize>) -> Result<Vec<T>> { fn collect_range(&self, from: Option<usize>, to: Option<usize>) -> Result<Vec<T>> {
if !self.is_pushed_empty() {
return Err(Error::UnsupportedUnflushedState);
}
let stored_len = self.stored_len(); let stored_len = self.stored_len();
let from = from.unwrap_or_default(); let from = from.unwrap_or_default();
let to = to.map_or(stored_len, |i| i.min(stored_len)); let to = to.map_or(stored_len, |i| i.min(stored_len));
if from >= stored_len { if from >= stored_len || from >= to {
return Ok(vec![]); return Ok(vec![]);
} }
let mmap = self.mmap.load(); Ok(self
.into_iter()
(from..to) .skip(from)
.map(|index| self.get_stored_(index, &mmap).map(|opt| opt.unwrap())) .take(to - from)
.collect::<Result<Vec<_>>>() .map(|(_, v)| v.into_inner())
.collect::<Vec<_>>())
} }
fn flush(&mut self) -> Result<()> { fn flush(&mut self) -> Result<()> {