Further improve memory usage of needle_map.CompactMap()
.
#6825
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
What problem are we solving?
#6804
How are we solving the problem?
As of 2e1506c,
CompactMap()
uses variable-size slices as ID buckets.An unexpected issue is that mostly-ordered needle writes causes the majority of buckets to end up filled, but with a lot of unused capacity - i.e. wasted memory. For the current bucket size of 10,000 elements, Golang allocates a capacity of 11,264, or ~12% waste.
This MR ensures that buckets which end up filled are re-sized so their capacity matches size; on average, it improves memory usage by ~10% for mostly ordered needle IDs. A couple
CompactMap()
memory pprofs yielded these averages:The underlying logic for
CompactMap.Set()
was also simplified in the process.How is the PR tested?
Every single existing unit and integration test should pass without issues; the existing API and behavior for CompactMap() is unchanged.
Checks