fix: prevent O(n²) memory allocation in content lookup map generation#14973
fix: prevent O(n²) memory allocation in content lookup map generation#14973matthewp merged 2 commits intowithastro:mainfrom
Conversation
🦋 Changeset detectedLatest commit: b90634a The changes in this PR will be included in the next version bump. Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
|
I'm going to create a preview release so we can test if this change will provide benefits |
commit: |
CodSpeed Performance ReportMerging #14973 will not alter performanceComparing Summary
Footnotes |
|
Wonderful @amankumarpandeyin thank you! Do you have any anecdotal data, did this improve your build performance for example? |
@matthewp thanks! i was experiencing OOM errors with large content collections (10k+ entries)... after this change builds complete without memory issues... the fix eliminates the quadratic object copying that was causing 50M string copies for that scale |
This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [astro](https://astro.build) ([source](https://github.com/withastro/astro/tree/HEAD/packages/astro)) | [`5.16.4` -> `5.16.5`](https://renovatebot.com/diffs/npm/astro/5.16.4/5.16.5) |  |  | --- ### Release Notes <details> <summary>withastro/astro (astro)</summary> ### [`v5.16.5`](https://github.com/withastro/astro/blob/HEAD/packages/astro/CHANGELOG.md#5165) [Compare Source](https://github.com/withastro/astro/compare/astro@5.16.4...astro@5.16.5) ##### Patch Changes - [#​14985](withastro/astro#14985) [`c016f10`](withastro/astro@c016f10) Thanks [@​florian-lefebvre](https://github.com/florian-lefebvre)! - Fixes a case where JSDoc annotations wouldn't show for fonts related APIs in the Astro config - [#​14973](withastro/astro#14973) [`ed7cc2f`](withastro/astro@ed7cc2f) Thanks [@​amankumarpandeyin](https://github.com/amankumarpandeyin)! - Fixes performance regression and OOM errors when building medium-sized blogs with many content entries. Replaced O(n²) object spread pattern with direct mutation in `generateLookupMap`. - [#​14958](withastro/astro#14958) [`70eb542`](withastro/astro@70eb542) Thanks [@​ascorbic](https://github.com/ascorbic)! - Gives a helpful error message if a user sets `output: "hybrid"` in their Astro config. The option was removed in Astro 5, but lots of content online still references it, and LLMs often suggest it. It's not always clear that the replacement is `output: "static"`, rather than `output: "server"`. This change adds a helpful error message to guide humans and robots. - [#​14901](withastro/astro#14901) [`ef53716`](withastro/astro@ef53716) Thanks [@​Darknab](https://github.com/Darknab)! - Updates the `glob()` loader to log a warning when duplicated IDs are detected - Updated dependencies \[[`d8305f8`](withastro/astro@d8305f8)]: - [@​astrojs/markdown-remark](https://github.com/astrojs/markdown-remark)@​6.3.10 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi4zOS4yIiwidXBkYXRlZEluVmVyIjoiNDIuMzkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==--> Co-authored-by: Renovate Bot <renovate@zarantonello.dev> Co-committed-by: Renovate Bot <renovate@zarantonello.dev>
Changes
Fixes #14893
{...lookupMap[collection]?.entries, [key]: value}??=) and direct property assignment - O(n) complexityBefore:
After
Testing
All 1326 existing tests pass (3 unrelated failures: clipboard + network flakes)
All content-related tests pass: Content Collections, references, render(), Intellisense
Docs
No docs changes needed - this is an internal performance optimization with no API changes.