Skip to content

Reduce memory usage of reads with small n_max - #857

Merged
hadley merged 4 commits into
mainfrom
fix-845
Oct 19, 2026
Merged

hadley merged 4 commits into
mainfrom
fix-845

Conversation

@hadley

@hadley hadley commented Oct 19, 2026

Copy link
Copy Markdown
Member

🤖 Written by AI 🤖

Fixes #845.

Header-only parse of an 80 MB XPT file drops from ~39 MB to ~5 KB allocated.

The reader no longer pre-allocates more rows than readstat can deliver: the initial allocation is capped at `n_max`, and when `n_max = 0` the value handler is not registered so readstat skips parsing values entirely. This reduces a header-only parse of an 80 MB XPT file from ~39 MB to ~5 KB allocated.

Fixes #845.
- Count rows only as they are seen, so `nrows_` is no longer seeded from the (potentially inaccurate) header row count
- Remove now-redundant `limitRows()`; readstat enforces `n_max` itself
- Guarantee growth progress when reallocating, fixing a potential out-of-bounds write when a header declares 0 rows
- Document `nrows_`/`nrowsAlloc_` fields
@hadley
hadley merged commit a334ad8 into main Oct 19, 2026
13 checks passed
@hadley
hadley deleted the fix-845 branch October 19, 2026 21:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Header-only parse pre-allocates 1e5 rows when row count is unknown

1 participant