Open alamb opened 1 year ago
It seems like deque in cpp ?
But what does adaptive mean in with adaptive sizing
?
thanks, @alamb
But what does adaptive mean in with adaptive sizing?
I think @yjshen meant something like storing the values in Vec<Vec<T>>
rather than Vec<T>
And when more space was needed, create a new Vec::with_capacity
rather than push to the existing Vec
(which might reallocate and copy)
We (Coralogix) may want to tackle this but combine with ColumnStatistics::distinct_count
to only allocate once.
Using statistics to improve the allocation performance certainly seems like a good idea -- though I am not sure the default distinct statistics are very reliable
take
Working on an poc for performance improvement which is related to this.
UPDATE: Now that @Rachelint has begun work on #11931 I turned this ticket into an "epic" (aka I'll link related tasks here)
Is your feature request related to a problem or challenge?
Making aggregations fast in datafusion helps its adoption and makes it even cooler
As part of the new #6904 work, @yjshen had an idea https://github.com/apache/arrow-datafusion/pull/6800#discussion_r1251142165 that could avoid a copy in the accumulator implementations:
Describe the solution you'd like
Adaptive sizing(perhaps?): How would the hash table header and states in each accumulator initialize and grow their sizes afterward?
Here is the structure of the current group operator
The implementation of this, such as Average is to use a
Vec<T>
. While this approach is simple to implement, it also means that as the Vec grows, the accumulated vales may be copied (up to 2 times on average, given a doubling strategy)An alternate, suggested by @yjshen is to segment the state into fixed-sized vectors, allocate a new vector at a time, fill it until full, then create a new vector for upcoming new states.
Thru this segmented approach, we could avoid memory copy for each resize, which the number of resizing would be great for high cardinality aggs, and grows the size more predictably.
But admittedly, this approach would also bring complexity for both header pointer management and update span multiple vectors.
Implementation Steps: