BodyBalanceEvaluation/memory_config.py
2025-07-30 19:09:15 +08:00

140 lines
5.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
内存优化配置文件
用于配置WebSocket视频流的内存使用参数
"""
# ==================== 前端内存优化配置 ====================
# 帧率控制
MAX_FPS = 15 # 最大帧率,降低可减少内存使用
FRAME_SKIP_THRESHOLD = 2 # 跳帧阈值每N+1帧显示1帧
# 内存监控
MEMORY_CHECK_INTERVAL_MS = 10000 # 内存检查间隔(毫秒)
MAX_MEMORY_USAGE_PERCENT = 80 # 内存使用率阈值(%),超过则自动清理
# 图像缓存
ENABLE_IMAGE_CACHE = True # 是否启用图像缓存优化
FORCE_GC_INTERVAL = 100 # 强制垃圾回收间隔(帧数)
# ==================== 后端内存优化配置 ====================
# 帧处理
BACKEND_FRAME_SKIP_RATIO = 3 # 后端跳帧比例每N帧处理1帧
MAX_FRAME_WIDTH = 320 # 最大帧宽度
MAX_FRAME_HEIGHT = 240 # 最大帧高度
# 内存限制
MAX_BACKEND_MEMORY_MB = 100 # 后端最大内存使用MB
BACKEND_MEMORY_CHECK_INTERVAL = 50 # 后端内存检查间隔(帧数)
# JPEG编码优化
JPEG_QUALITY = 50 # JPEG质量1-100越低内存使用越少
JPEG_PROGRESSIVE = False # 是否启用渐进式JPEG
JPEG_OPTIMIZE = True # 是否启用JPEG优化
# 队列管理
FRAME_QUEUE_SIZE = 1 # 帧队列大小设为1确保实时性
MAX_FRAME_RATE = 20 # 最大帧率限制
# ==================== 调试和监控配置 ====================
# 日志级别
MEMORY_LOG_LEVEL = 'INFO' # DEBUG, INFO, WARNING, ERROR
ENABLE_MEMORY_LOGGING = True # 是否启用内存使用日志
# 性能监控
ENABLE_PERFORMANCE_MONITORING = True # 是否启用性能监控
PERFORMANCE_LOG_INTERVAL = 60 # 性能日志间隔(秒)
# ==================== 自适应优化配置 ====================
# 自适应帧率
ENABLE_ADAPTIVE_FRAMERATE = True # 是否启用自适应帧率
MIN_FPS = 5 # 最小帧率
MAX_ADAPTIVE_FPS = 30 # 最大自适应帧率
# 自适应质量
ENABLE_ADAPTIVE_QUALITY = True # 是否启用自适应质量
MIN_JPEG_QUALITY = 30 # 最小JPEG质量
MAX_JPEG_QUALITY = 80 # 最大JPEG质量
# 内存压力阈值
MEMORY_PRESSURE_LEVELS = {
'low': 50, # 低压力阈值(%
'medium': 70, # 中等压力阈值(%
'high': 85, # 高压力阈值(%
'critical': 95 # 临界压力阈值(%
}
# ==================== 辅助函数 ====================
def get_memory_config():
"""获取内存配置字典"""
return {
'frontend': {
'max_fps': MAX_FPS,
'frame_skip_threshold': FRAME_SKIP_THRESHOLD,
'memory_check_interval': MEMORY_CHECK_INTERVAL_MS,
'max_memory_percent': MAX_MEMORY_USAGE_PERCENT,
'enable_cache': ENABLE_IMAGE_CACHE,
'force_gc_interval': FORCE_GC_INTERVAL
},
'backend': {
'frame_skip_ratio': BACKEND_FRAME_SKIP_RATIO,
'max_frame_size': (MAX_FRAME_WIDTH, MAX_FRAME_HEIGHT),
'max_memory_mb': MAX_BACKEND_MEMORY_MB,
'memory_check_interval': BACKEND_MEMORY_CHECK_INTERVAL,
'jpeg_quality': JPEG_QUALITY,
'jpeg_progressive': JPEG_PROGRESSIVE,
'jpeg_optimize': JPEG_OPTIMIZE,
'queue_size': FRAME_QUEUE_SIZE,
'max_frame_rate': MAX_FRAME_RATE
},
'monitoring': {
'log_level': MEMORY_LOG_LEVEL,
'enable_memory_logging': ENABLE_MEMORY_LOGGING,
'enable_performance_monitoring': ENABLE_PERFORMANCE_MONITORING,
'performance_log_interval': PERFORMANCE_LOG_INTERVAL
},
'adaptive': {
'enable_adaptive_framerate': ENABLE_ADAPTIVE_FRAMERATE,
'min_fps': MIN_FPS,
'max_adaptive_fps': MAX_ADAPTIVE_FPS,
'enable_adaptive_quality': ENABLE_ADAPTIVE_QUALITY,
'min_jpeg_quality': MIN_JPEG_QUALITY,
'max_jpeg_quality': MAX_JPEG_QUALITY,
'memory_pressure_levels': MEMORY_PRESSURE_LEVELS
}
}
def apply_memory_config(config_dict):
"""应用内存配置"""
global MAX_FPS, FRAME_SKIP_THRESHOLD, MAX_MEMORY_USAGE_PERCENT
global BACKEND_FRAME_SKIP_RATIO, MAX_FRAME_WIDTH, MAX_FRAME_HEIGHT
global MAX_BACKEND_MEMORY_MB, JPEG_QUALITY
if 'frontend' in config_dict:
frontend = config_dict['frontend']
MAX_FPS = frontend.get('max_fps', MAX_FPS)
FRAME_SKIP_THRESHOLD = frontend.get('frame_skip_threshold', FRAME_SKIP_THRESHOLD)
MAX_MEMORY_USAGE_PERCENT = frontend.get('max_memory_percent', MAX_MEMORY_USAGE_PERCENT)
if 'backend' in config_dict:
backend = config_dict['backend']
BACKEND_FRAME_SKIP_RATIO = backend.get('frame_skip_ratio', BACKEND_FRAME_SKIP_RATIO)
if 'max_frame_size' in backend:
MAX_FRAME_WIDTH, MAX_FRAME_HEIGHT = backend['max_frame_size']
MAX_BACKEND_MEMORY_MB = backend.get('max_memory_mb', MAX_BACKEND_MEMORY_MB)
JPEG_QUALITY = backend.get('jpeg_quality', JPEG_QUALITY)
if __name__ == '__main__':
# 测试配置
config = get_memory_config()
print("当前内存优化配置:")
for category, settings in config.items():
print(f"\n{category.upper()}:")
for key, value in settings.items():
print(f" {key}: {value}")