Skip to content

Release netCDF memory-map pages after each frame - #5463

Open
erikfransson wants to merge 6 commits into
MDAnalysis:developfrom
erikfransson:ncdf-release-mmap-pages
Open

erikfransson wants to merge 6 commits into
MDAnalysis:developfrom
erikfransson:ncdf-release-mmap-pages

Conversation

@erikfransson

@erikfransson erikfransson commented Aug 16, 2026 •

Copy link
Copy Markdown

fixes #5541

Description

NCDFReader._read_frame now drops the pages of scipy's memory map once the frame has been copied into the Timestep. Nothing else unmaps them, so without this the resident memory of the process grows towards the size of the whole trajectory file while it is read, as documented in discussion here. (ping @orbeckst )

MADV_DONTNEED does not exist on Windows, so the call is guarded by hasattr(mmap, "MADV_DONTNEED") and the reader is unchanged there.

Changes made in this Pull Request:

  • NCDFReader._read_frame now drops the pages of scipy's memory map once the
    frame has been read into the Timestep.
  • Added a test that the pages are dropped when a frame is read.

LLM / AI generated code disclosure

LLMs or other AI-powered tools (beyond simple IDE use cases) were used in this contribution: yes test written by AI

PR Checklist

  • Issue raised/referenced?
  • Tests updated/added?
  • Documentation updated/added?
  • package/CHANGELOG file updated?
  • Is your name in package/AUTHORS?
  • I have read and understand the current AI Policy
  • LLM/AI disclosure was updated.

Developers Certificate of Origin

I certify that I can submit this code contribution as described in the Developer Certificate of Origin, under the MDAnalysis LICENSE.

NCDFReader._read_frame now drops the pages of scipy's memory map once
the frame has been copied into the Timestep. Nothing else unmaps them,
so without this the resident memory of the process grows towards the
size of the whole trajectory file while it is read.

The map is read only, so dropping is safe: pages are faulted back in if
the data are read again. MADV_DONTNEED does not exist on Windows, where
the call is skipped and the reader is unchanged.
@codecov

codecov Bot commented Aug 16, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.92%. Comparing base (ae9ff4b) to head (c45c194).

Additional details and impacted files
@@           Coverage Diff            @@
##           develop    #5463   +/-   ##
========================================
  Coverage    93.92%   93.92%           
========================================
  Files          184      184           
  Lines        22661    22665    +4     
  Branches      3223     3224    +1     
========================================
+ Hits         21284    21288    +4     
  Misses         917      917           
  Partials       460      460           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Comment thread package/MDAnalysis/coordinates/TRJ.py Resolved
SimpleNamespace(madvise=advice.append),
)
universe.trajectory[1]
assert advice == [mmap.MADV_DONTNEED]

@tylerjereddy tylerjereddy Aug 31, 2026 •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The test is a bit convoluted with monkeypatch--could we avoid that?

Also, am I understanding correctly that on this branch something like https://github.com/pythonprofilers/memory_profiler should show a constant level of physical memory consumption, while it should increase linearly when reading in/iterating over a trajecotry of the appropriate type on the develop branch?

We could probably capture that with https://asv.readthedocs.io/en/stable/writing_benchmarks.html#peak-memory as well, assuming you're saying that physical memory is being used excessively on develop in these scenarios.

@erikfransson erikfransson Sep 5, 2026 •

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea I agree, I removed the test.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But yes I ran memory profilers locally on 4GB sized trajectory.
Reading frame by frame with develop leads to memory usage climbing steadily and reaching peak memory of 4GB since nothing unmaps the scipys memory map.
With the fix in place the memory didnt climb at all and behaved as expected when reading frame by frame.

@orbeckst orbeckst added the AI-assisted Generated with AI/LLM assistance label Sep 4, 2026
Review feedback: a versionchanged directive is not needed for a bug fix
with no user-facing behaviour change, and the test only asserted that
madvise is called with a particular flag, which is an implementation
detail. The values read from the trajectory are unchanged and already
covered by the existing NCDF reader tests.
@erikfransson

Copy link
Copy Markdown
Author

@tylerjereddy @orbeckst Anything else you would like me to do?

Comment thread package/CHANGELOG Resolved
@orbeckst

orbeckst commented Oct 2, 2026

Copy link
Copy Markdown
Member

@tylerjereddy would you be comfortable giving an "approve" or "request changes" review?

@orbeckst orbeckst self-assigned this Oct 2, 2026
@orbeckst orbeckst linked an issue Nov 1, 2026 that may be closed by this pull request

@orbeckst orbeckst left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall this looks sensible to me. However, we don't know if the problem also exists on Windows (or macOS). I'd like to be able to state clearly which OS is affected and on which the fix solves the problem.

Comment thread package/CHANGELOG
Comment on lines +26 to +27
that provides `MADV_DONTNEED`, i.e. not Windows (Discussion #4792,
PR #5463).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
that provides `MADV_DONTNEED`, i.e. not Windows (Discussion #4792,
PR #5463).
that provides `MADV_DONTNEED`, i.e. not Windows (#5541, PR #5463)

I raised a proper issue from the discussion #5541

@tylerjereddy

Copy link
Copy Markdown
Member

@tylerjereddy would you be comfortable giving an "approve" or "request changes" review?

I'm a bit slow getting to this, but I'll make a calendar reminder to look more closely. I may still be slow (few days) though.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

AI-assisted Generated with AI/LLM assistance Component-Readers Format-Amber

Projects

None yet

Development

Successfully merging this pull request may close these issues.

memory leak in NCDF reader

3 participants