Files
SystemSimulationApp/docs/other/结果分块存储验证-2026-09-15.md
T

53 lines
5.2 KiB
Markdown
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.
# 结果分块存储交付与验证
日期:2026-09-15。
## 已实现
- 项目根目录 `simresults/` 保存每次运行的状态块、输出块和清单,默认总配额 1 GiB。通过 `SIMULATION_RESULT_STORAGE_MB` 调整,单位 MiB。
- 每块写入前,为状态及未来输出一起预留容量;跨进程锁串行分配配额。优先淘汰最早结束且未被使用的档案;保护活动运行、仍存活的孤儿工作进程和用户额外放入的文件。无法腾出空间时返回部分结果及 `storage-quota`。
- 原生采样采用固定大小缓冲和同步批量写入,磁盘慢时等待;无无限增长的异步队列。求解器必要状态及事件定位数据不受影响。
- 求解结束后按原有顺序分块计算输出,保留原有数值编码。相同时间戳在块边界仍使用原有后值替换规则。
- 正常取消及求解失败补写不满块。CRC32 和提交标记支持识别异常退出后的有效前缀;强制终止时不伪造尚未计算的输出。
- Windows/Linux 共用小端 Float64 格式和 64 位偏移;纯代数模型内部占位状态有明确列标记。I/O 错误、配额耗尽和控制进程断开分别报告。
详细配置、文件格式和行为边界见 [C 后端说明](../../native/README.md#仿真结果分块存储)。本阶段的 Python/HTTP 返回和浏览器仍使用完整结果;按变量、时间范围读取及浏览器按需加载尚未实现。
## Windows 实际验证
环境:项目 `.venv-win`,Python 3.12、MinGW GCC 8.1、SUNDIALS 7.4.0。
专项命令:
```text
python -W error::ResourceWarning -m unittest tests.test_result_storage tests.test_native_sample_storage tests.test_native_result_transport tests.test_native_json_writer tests.test_native_worker_control tests.test_native_solver_control -v
```
结果:38 项,37 通过、1 跳过。跳过的是依赖 Linux `/dev/full` 的真实延迟写入失败测试。新增测试覆盖固定缓冲、跨块同时间替换、负零位模式、完整尾块、纯代数模型、并发容量预留、跨进程保护、旧档案清理、未知文件保护、截断与损坏识别、配额耗尽、I/O 失败及强制终止后的状态块保留。
数值基线使用改造前保存的 `native-skill-test.xml`(终止时间 0.15 秒,采样间隔 0.0001 秒),与分块版本的 RK45、BDF 分别比较。每种方法均比较 1502 个采样、176 个序列列,共 264,539 个数值及 25 项元数据;原始 Float64 位模式(含负零)、事件样本和求解统计全部一致。
本地日志和基线位于 Git 忽略目录 `test/chunk-storage/`:`final-regression.log`、`parity-RK45.json`、`parity-BDF.json`。
## 首次验收未通过项(后续复核见补充报告)
2026-09-15 后续复核:高级摩擦已经在 9 月 13 日实现;下列第 1 项是过时测试断言,第 2 项是 Windows 时间戳精度造成的测试排序问题,两项均已修正。高级摩擦等 13 个补齐算例已使用分块存储重新检查完整曲线。具体组件、覆盖入口、实际结果及仍未定因的进程问题见 [未完成验收项复核](分块存储未完成验收项复核-2026-09-15.md)。以下保留首次验收的历史结果,不代表组件当前尚未实现。
首次验收没有宣称全量测试通过:
1. 机械参数测试 `test_mecmas21_choice_metadata_preserves_amesim_codes` 仍要求“尚未实现”的高级摩擦描述,与当前组件说明不一致。该测试单独复测仍失败;本次未修改机械组件或该断言。
2. 扩展回归 34 项中,30 通过、3 项因 Windows 符号链接权限跳过,另有未修改的缓存测试 `test_lock_shards_are_bounded_and_collisions_only_defer_eviction` 失败:`skippedInUse` 期望 1、实际 0;对活动项保留和另一旧项删除的断言已通过。单独运行该缓存测试同样失败。
3. 全量发现测试的长进程运行出现 Python 异常退出,退出码 `0xC0000005`,未取得完整汇总。最后执行的 UD00 模型测试另行运行通过;没有据此判定异常退出原因。
相关日志:`test/chunk-storage/full-regression.log`、`test/chunk-storage/extended-regression.log`。
## Linux 状态
已检查 POSIX 文件偏移、文件锁、路径及统一二进制格式,并将新增测试接入现有 `native-linux` CI 作业。本机仅有 Docker Desktop 的 WSL 发行环境且 Docker 服务未运行,未取得实际 Linux 工具链执行结果;Linux 实机验收仍待执行。
## 项目路径迁移补充验证
清单的目录引用已改为 `simresults/run-<id>`,相对于项目根目录。读取使用结果 ID 与当前安装位置计算路径,兼容旧清单中的过期绝对目录提示。原生进程执行时接收的绝对路径仍由当前位置即时生成。
Windows 实际执行 `tests.test_result_storage`、`tests.test_native_sample_storage`、`tests.test_native_result_transport`,23 项全部通过。新增测试将包含存储模块和结果档案的测试项目改名移动到含中文、空格的新目录,确保原目录已不存在,再从无关工作目录启动新 Python 进程;旧块读取与新档案创建均成功。日志为 `test/chunk-storage/relative-path-regression.log`。移动项目需先停止应用,移动后重新启动;未承诺运行中的目录迁移。