diff --git a/datafusion/physical-expr/src/aggregate/array_agg.rs b/datafusion/physical-expr/src/aggregate/array_agg.rs index 239d5b4dd21e..3aecb70f76d0 100644 --- a/datafusion/physical-expr/src/aggregate/array_agg.rs +++ b/datafusion/physical-expr/src/aggregate/array_agg.rs @@ -321,15 +321,15 @@ impl Accumulator for ArrayAggAccumulator { } fn size(&self) -> usize { - std::mem::size_of_val(self) - + (std::mem::size_of::() * self.values.capacity()) + size_of_val(self) + + self.values.capacity() * size_of::() + + self.datatype.size() + - size_of_val(&self.datatype) + self .values .iter() - .map(|arr| arr.get_array_memory_size()) + .map(Array::get_array_memory_size) .sum::() - + self.datatype.size() - - std::mem::size_of_val(&self.datatype) } } @@ -452,11 +452,21 @@ where } fn size(&self) -> usize { - std::mem::size_of_val(self) - + std::mem::size_of::>() * self.values.capacity() - + self.values.iter().map(|arr| arr.capacity()).sum::() - * std::mem::size_of::<::Native>() + let data_type_size = self.data_type.size(); + size_of_val(self) + + data_type_size + self.null_state.size() + + self.values.capacity() * size_of::>() + + self + .values + .iter() + .map(|b| { + // Each primitive builder also stores the data type. + data_type_size + + size_of_val(b.values_slice()) + + size_of_val(&b.validity_slice()) + }) + .sum::() } } @@ -560,18 +570,18 @@ impl GroupsAccumulator for StringArrayAggGroupsAccumulator { } fn size(&self) -> usize { - std::mem::size_of_val(self) - + std::mem::size_of::() * self.values.capacity() + size_of_val(self) + + self.null_state.size() + + self.values.capacity() * size_of::() + self .values .iter() - .map(|arr| { - std::mem::size_of_val(arr.values_slice()) - + std::mem::size_of_val(arr.offsets_slice()) - + arr.validity_slice().map(std::mem::size_of_val).unwrap_or(0) + .map(|b| { + size_of_val(b.values_slice()) + + size_of_val(b.offsets_slice()) + + size_of_val(&b.validity_slice()) }) .sum::() - + self.null_state.size() } } diff --git a/datafusion/physical-expr/src/aggregate/array_agg_distinct.rs b/datafusion/physical-expr/src/aggregate/array_agg_distinct.rs index 244a44acdcb5..8bcef98e2bdb 100644 --- a/datafusion/physical-expr/src/aggregate/array_agg_distinct.rs +++ b/datafusion/physical-expr/src/aggregate/array_agg_distinct.rs @@ -167,10 +167,9 @@ impl Accumulator for DistinctArrayAggAccumulator { } fn size(&self) -> usize { - std::mem::size_of_val(self) + ScalarValue::size_of_hashset(&self.values) - - std::mem::size_of_val(&self.values) - + self.datatype.size() - - std::mem::size_of_val(&self.datatype) + size_of_val(self) + self.datatype.size() - size_of_val(&self.datatype) + + ScalarValue::size_of_hashset(&self.values) + - size_of_val(&self.values) } }