fix: 内存误判(psutil→GlobalMemoryStatusEx) + 时间戳硬截止(>30min丢弃)

- easyocr_worker.py: 删除psutil物理内存检查,统一使用GlobalMemoryStatusEx
  (Windows上psutil可比Task Manager少报~1.7GB,导致4.2GB可用误判为2.5GB)
- monitor.py: _ocr_text_has_fresh_timestamp()加硬截止——最新时间戳>1800s(30min)
  无论是否含CJK均丢弃,修复15:09看到13:34消息(90min前)被误回复
- 新增_timestamp_age_seconds()辅助方法
This commit is contained in:
youpaishidifu
2026-08-05 15:25:33 +08:00
parent d8c0e62a2d
commit 4aeb03d869
2 changed files with 86 additions and 33 deletions
+32 -33
View File
@@ -99,39 +99,38 @@ try:
# ── 预检:物理内存+虚拟内存是否足够加载 CUDA 库 ──
_vm = _get_virtual_memory_info()
# 检查物理内存:CUDA加载需要足够物理内存,否则会使用页面文件导致冻结
try:
import psutil
_mem = psutil.virtual_memory()
_avail_phys_gb = _mem.available / (1024**3)
_used_phys_gb = _mem.used / (1024**3)
_total_phys_gb = _mem.total / (1024**3)
# ⭐ 页面文件百分比 + 总提交量检查:防页面文件94%+时仍尝试CUDA导致冻结
_pagefile_pct = _vm.get("commit_pct", 0) if _vm else 0
_pagefile_used_gb = _total_phys_gb + (_vm.get("total_pagefile_gb", 0) - _vm.get("avail_pagefile_gb", 0)) - _avail_phys_gb if _vm else 0
_commit_gb = _used_phys_gb + (_vm.get("total_pagefile_gb", 0) - _vm.get("avail_pagefile_gb", 0)) if _vm else _used_phys_gb
if _pagefile_pct > 85.0 or _commit_gb > _total_phys_gb * 1.5:
_msg = (
f"系统内存压力过高: 物理剩余{_avail_phys_gb:.1f}GB({_mem.percent}%),"
f"页面文件已用{_pagefile_pct}%,总提交{_commit_gb:.1f}GB>{_total_phys_gb*1.5:.1f}GB阈值"
)
_write_crash_log(f"{datetime.now()} [easyocr_worker] 系统内存压力预检失败: {_msg}")
os.environ["EASYOCR_FORCE_CPU"] = "1"
sys.stderr.write(f"[easyocr_worker] ⚠️ {_msg},降级CPU模式\n")
sys.stderr.flush()
elif _avail_phys_gb < 3.0:
_msg = (
f"物理内存不足: 剩余{_avail_phys_gb:.1f}GB"
f"(总计{_total_phys_gb:.1f}GB,使用{_mem.percent}%)"
f",CUDA加载需要≥3GB物理内存"
)
_write_crash_log(f"{datetime.now()} [easyocr_worker] 物理内存预检失败: {_msg}")
# 设置环境变量强制CPU模式,而不是直接退出
os.environ["EASYOCR_FORCE_CPU"] = "1"
sys.stderr.write(f"[easyocr_worker] ⚠️ {_msg},降级CPU模式\n")
sys.stderr.flush()
except Exception:
pass # psutil不可用时不阻断
# ⭐ 统一使用 GlobalMemoryStatusEx(与 monitor.py / Task Manager 一致)
# psutil.virtual_memory().available 在 Windows 上可比 Task Manager 少报 ~1.7GB,
# 导致 4.2GB 可用时误判为 2.5GB 触发降级。
if _vm:
try:
_avail_phys_gb = _vm.get("avail_phys_gb", 0)
_total_phys_gb = _vm.get("total_phys_gb", 0)
_used_phys_gb = _total_phys_gb - _avail_phys_gb
_pagefile_pct = _vm.get("commit_pct", 0)
_pagefile_used_gb = _vm.get("total_pagefile_gb", 0) - _vm.get("avail_pagefile_gb", 0)
_commit_gb = _used_phys_gb + _pagefile_used_gb
if _pagefile_pct > 85.0 or _commit_gb > _total_phys_gb * 1.5:
_msg = (
f"系统内存压力过高: 物理剩余{_avail_phys_gb:.1f}GB,"
f"页面文件已用{_pagefile_pct}%,总提交{_commit_gb:.1f}GB>{_total_phys_gb*1.5:.1f}GB阈值"
)
_write_crash_log(f"{datetime.now()} [easyocr_worker] 系统内存压力预检失败: {_msg}")
os.environ["EASYOCR_FORCE_CPU"] = "1"
sys.stderr.write(f"[easyocr_worker] ⚠️ {_msg},降级CPU模式\n")
sys.stderr.flush()
elif _avail_phys_gb < 3.0:
_msg = (
f"物理内存不足: 剩余{_avail_phys_gb:.1f}GB"
f"(总计{_total_phys_gb:.1f}GB)"
f",CUDA加载需要≥3GB物理内存"
)
_write_crash_log(f"{datetime.now()} [easyocr_worker] 物理内存预检失败: {_msg}")
os.environ["EASYOCR_FORCE_CPU"] = "1"
sys.stderr.write(f"[easyocr_worker] ⚠️ {_msg},降级CPU模式\n")
sys.stderr.flush()
except Exception:
pass # GlobalMemoryStatusEx 失败时不阻断
# ⭐ 检查页面文件:百分比>85% 或 剩余<2GB 时退出(防冻结)
if _vm and (_vm.get("commit_pct", 0) > 85.0 or _vm.get("avail_pagefile_gb", 99) < 2.0):
_msg = (