feat: Add MemoryMonitor class for Pico W memory usage tracking and reporting
This commit is contained in:
parent
1c9f1d731e
commit
954cd144b9
96
Scripts/memory_check.py
Normal file
96
Scripts/memory_check.py
Normal file
@ -0,0 +1,96 @@
|
||||
import gc
|
||||
|
||||
class MemoryMonitor:
|
||||
"""Monitor and display Pico W memory usage."""
|
||||
|
||||
def __init__(self, interval=300):
|
||||
"""
|
||||
Initialize memory monitor.
|
||||
|
||||
Args:
|
||||
interval: Seconds between memory checks (default: 300 = 5 minutes)
|
||||
"""
|
||||
self.interval = interval
|
||||
self.last_check = 0
|
||||
self.initial_free = None # Track initial free memory
|
||||
|
||||
def should_run(self, current_time):
|
||||
"""Check if it's time to run memory check."""
|
||||
if current_time - self.last_check >= self.interval:
|
||||
self.last_check = current_time
|
||||
return True
|
||||
return False
|
||||
|
||||
def run(self):
|
||||
"""Check and display memory usage."""
|
||||
# Force garbage collection before checking
|
||||
gc.collect()
|
||||
|
||||
# Get memory stats
|
||||
free = gc.mem_free()
|
||||
allocated = gc.mem_alloc()
|
||||
total = free + allocated
|
||||
|
||||
# Store initial free memory on first run
|
||||
if self.initial_free is None:
|
||||
self.initial_free = free
|
||||
|
||||
# Calculate memory leak (if any)
|
||||
leaked = self.initial_free - free if self.initial_free else 0
|
||||
|
||||
# Print memory report
|
||||
print("\n" + "="*50)
|
||||
print("Pico W Memory (RAM):")
|
||||
print("="*50)
|
||||
print("Total: {:.1f} KB".format(total / 1024))
|
||||
print("Used: {:.1f} KB ({:.1f}%)".format(
|
||||
allocated / 1024,
|
||||
(allocated/total)*100
|
||||
))
|
||||
print("Free: {:.1f} KB ({:.1f}%)".format(
|
||||
free / 1024,
|
||||
(free/total)*100
|
||||
))
|
||||
|
||||
# Show memory leak warning if detected
|
||||
if leaked > 5120: # More than 5 KB leaked
|
||||
print("⚠️ Leaked: {:.1f} KB since startup".format(leaked / 1024))
|
||||
|
||||
print("="*50 + "\n")
|
||||
|
||||
# Return memory info for other uses (like web server)
|
||||
return {
|
||||
'total_kb': total / 1024,
|
||||
'used_kb': allocated / 1024,
|
||||
'free_kb': free / 1024,
|
||||
'usage_percent': (allocated/total)*100,
|
||||
'leaked_kb': leaked / 1024 if leaked > 0 else 0
|
||||
}
|
||||
|
||||
def check_memory_once():
|
||||
"""One-time memory check (for startup diagnostics)."""
|
||||
gc.collect()
|
||||
free = gc.mem_free()
|
||||
allocated = gc.mem_alloc()
|
||||
total = free + allocated
|
||||
|
||||
print("\n" + "="*50)
|
||||
print("Startup Memory Check:")
|
||||
print("="*50)
|
||||
print("Total: {:.1f} KB".format(total / 1024))
|
||||
print("Used: {:.1f} KB ({:.1f}%)".format(
|
||||
allocated / 1024,
|
||||
(allocated/total)*100
|
||||
))
|
||||
print("Free: {:.1f} KB ({:.1f}%)".format(
|
||||
free / 1024,
|
||||
(free/total)*100
|
||||
))
|
||||
print("="*50 + "\n")
|
||||
|
||||
return {
|
||||
'total_kb': total / 1024,
|
||||
'used_kb': allocated / 1024,
|
||||
'free_kb': free / 1024,
|
||||
'usage_percent': (allocated/total)*100
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user