polars_io/parquet/read/
mmap.rs1use arrow::array::Array;
2use arrow::bitmap::Bitmap;
3use arrow::datatypes::Field;
4use polars_error::PolarsResult;
5use polars_parquet::read::{
6 BasicDecompressor, ColumnChunkMetadata, Filter, PageReader, column_iter_to_arrays,
7};
8use polars_utils::mmap::{MemReader, MemSlice};
9
10pub enum ColumnStore {
22 Local(MemSlice),
23}
24
25pub(super) fn mmap_columns<'a>(
28 store: &'a ColumnStore,
29 field_columns: &'a [&ColumnChunkMetadata],
30) -> Vec<(&'a ColumnChunkMetadata, MemSlice)> {
31 field_columns
32 .iter()
33 .map(|meta| _mmap_single_column(store, meta))
34 .collect()
35}
36
37fn _mmap_single_column<'a>(
38 store: &'a ColumnStore,
39 meta: &'a ColumnChunkMetadata,
40) -> (&'a ColumnChunkMetadata, MemSlice) {
41 let byte_range = meta.byte_range();
42 let chunk = match store {
43 ColumnStore::Local(mem_slice) => {
44 mem_slice.slice(byte_range.start as usize..byte_range.end as usize)
45 },
46 };
47 (meta, chunk)
48}
49
50pub fn to_deserializer(
53 columns: Vec<(&ColumnChunkMetadata, MemSlice)>,
54 field: Field,
55 filter: Option<Filter>,
56) -> PolarsResult<(Vec<Box<dyn Array>>, Bitmap)> {
57 let (columns, types): (Vec<_>, Vec<_>) = columns
58 .into_iter()
59 .map(|(column_meta, chunk)| {
60 chunk.prefetch();
62
63 let pages = PageReader::new(MemReader::new(chunk), column_meta, vec![], usize::MAX);
64 (
65 BasicDecompressor::new(pages, vec![]),
66 &column_meta.descriptor().descriptor.primitive_type,
67 )
68 })
69 .unzip();
70
71 column_iter_to_arrays(columns, types, field, filter)
72}