跳转至

核心规模与报告消费验收

以下原始验收记录来自 2026-10-01,合成数据不代表真实业务性能。起点与参考源码均为 26d0f2d1f38c1a0483fe7c9baa2a2b68124d9909,开始时仓库工作树干净;修复后的测量来自未提交工作树。 参考源码由 git archive 提取到临时目录,harness 通过 --source 切换源码,并记录实际导入的 mars.__file__、源码哈希与 harness 两个文件的哈希。没有覆盖参考提交之后的代码。

环境与测量方法

运行日期为 2026-10-01 起(Asia/Shanghai;每轮 JSON 单独记录 UTC 时间)。环境为 Windows 11 10.0.26200、Intel Core i7-14650HX、24 逻辑 CPU、63.7 GiB 物理内存;Python 3.10.19、 NumPy 2.2.6、Pandas 2.3.3、Polars 1.37.1、scikit-learn 1.7.2、psutil 7.2.2。 PyArrow 等实际版本、每轮可用内存和原生线程池见 JSON。没有检测到 cgroup,Windows job 的限制 未暴露,不能将物理内存视为容器可用内存保证。

固定种子 20261001、4 线程。在导入 NumPy/Polars 前设置 Polars、OMP、OpenBLAS、MKL、 NumExpr 和 VECLIB 环境变量,并记录 Polars 实际线程数及 threadpoolctl 的原生线程池。 默认每案例 300 秒、进程树 RSS 8 GiB 预算。明显超预算的保守估计会记 not_run;实际超限或超时 终止 worker 与其子进程,保存阶段、退出码和有限日志,继续其他案例,不降档或无限重试。

预算状态与操作系统退出状态是两项证据。直属 worker 的退出码只由其 Popen 对象回收; psutil 发现、控制并有界等待后代,不等待该直属 worker。未知退出状态保存为 null 并注明 unknown,不补成 0 或固定非零数。自然退出后仍清理已观察到的后代;读取诊断或清理失败时 记录原因、已完成阶段及残留进程,不让一个案例无限等待。

每个案例、输入后端、预热和测量轮次都是独立 Python 进程;大型案例串行运行。预热单列,不参加 中位数。正式 standard 与报告 large 每侧各 3 轮;只有 1 轮的扩规模诊断仅报告单次观察, 不作稳定收益结论,也不从三次样本推算 P95。旧规则发布门禁不被新复核触发线替代。

主要内存口径为配置间隔 10ms 的观察 RSS,包含 Arrow/NumPy/Polars 原生内存;系统调用与调度 可能延长实际间隔。分别记录主进程与 进程树 RSS 和,不混作独占物理内存,共享页可能重复计数,瞬时峰值可能漏采。阶段包含起始、 结束、观察峰值与相对起始增量;全流程包含导入、原始宽表准备、正确性验证、保存以及外部消费。 嵌套阶段不能相加作总耗时。公开计算入口产生报告时,报告装配包含在 public_compute 中; 规则和注入矩阵场景另外单测 report_construct,不会将这些时间称为挖掘或 selector.fit。

统一 CLI 与实际 workload

入口为 benchmarks/benchmark_core_capacity.py;benchmark_core_workloads.py 只提供固定场景与 数据,没有独立平台或插件层。--help 列出档位;--case 可选一个或多个案例,--backend 可选 pandas、polars、both。输出默认使用带微秒的时间戳,显式输出路径也拒绝覆盖。

python benchmarks/benchmark_core_capacity.py --suite all --scale smoke --backend both --repeats 1
python benchmarks/benchmark_core_capacity.py --suite all --scale standard --backend both --repeats 3
python benchmarks/benchmark_core_capacity.py --suite reports --scale large --backend both --repeats 3
python benchmarks/benchmark_core_capacity.py --suite analysis --scale large --backend polars --repeats 1
python benchmarks/benchmark_core_capacity.py --case rule_report --scale large --backend polars --repeats 3 --timeout 300 --memory-budget-mib 8192
python benchmarks/benchmark_core_capacity.py --case profile_columns binning_rows --scale large --backend polars --repeats 1

同环境对照及旧快照用当前源码恢复(先将参考提交 src 提取到独立临时目录):

python benchmarks/benchmark_core_capacity.py --suite reports --scale large --source /path/to/reference/src --backend both --repeats 3 --output /tmp/reference.json
python benchmarks/benchmark_core_capacity.py --suite reports --scale large --baseline-json /tmp/reference.json --backend both --repeats 3 --output /tmp/current.json
python benchmarks/benchmark_core_capacity.py --case rule_report correlation_long --scale smoke --source /path/to/reference/src --consumer-source ./src --backend polars --repeats 1

Windows 使用可写临时路径替换 /tmp;本轮实际解释器位于 Conda mars 环境。 对照会核对规模、种子、线程、超时、预算、依赖与硬件;报告规则/相关性逐表检查 schema、行列 顺序和完整数据的原生批次哈希,随机 report_id 与时间不参与数值差异比较,快照内部身份必须精确保留。 早期 harness 把已安装 mars-risk distribution 也算入依赖,参考 src 没有 egg-info 时取到了本机旧包 0.0.16,拒绝产生比值。实际导入路径与参考源码哈希已核对,目标源码版本均为 0.0.28;修正后 目标源码版本与已安装 distribution 单列,环境对照仍严格检查所有数值依赖。该修正只影响元数据校验, 不改变采样、计时、数据或算法。Pandas 交叉基准的半样本包含端点错误另行修正后重新建立分析对照, 原调试记录不参与正式比较。

基线工具现记录明确的 workload、独立进程测量和快照消费合同,以及每轮有效算法参数、 诊断分支、资源策略和实际参与计算的依赖。线性诊断区分包未安装、安装但导入失败、成功 执行和明确跳过,保留 VIF/系数表的实际行数。相同输入尺寸不足以证明工作量相同。 源码及 harness 哈希只用于溯源;生产优化前后的 commit 无需相同,注释或日志变化也不会 单独使对照失效。更改 fixture、测量口径或消费工作时需更新对应合同,不能只保持旧标识。

comparison 区分可比较、不可比较、执行失败、语义不一致和有目的的资源策略对照。 诊断或工作量不同时保留具体差异路径,不生成常规提速比例或退化结论。线程、batch_size、 n_jobs 等资源策略的刻意变化需用 --comparison-purpose 说明目的,输出中保留差异, 不会当作完全同配置对照。历史 JSON 缺少新合同字段时明确标注兼容信息不足,不猜测补齐, 也不覆盖旧轮次。2026-10-01 正式线性对照的双方均记录 optional_diagnostics=available; 本次加固不据此推翻已经发布的性能记录。

案例 smoke standard large 实际计算路径
rule_report 1,000 审计行 10,000 50,000 合成真实契约统计 → to_report;不挖掘全部候选
rule_mining / rule_states 480 行 2,000 4,000 独立 train/validation,真实 mine_rules,候选预算 50
correlation_short / long 40 特征 500 3,000 固定 1,500 行 NumPy 矩阵 → 完整关系报告
correlation_1000_short / long 40 1,000 默认不重复执行 同一矩阵注入诊断
profile / binning 800×8 50,000×200 200,000×1,000 generate_profile / evaluate,基础确定性分箱
*_batch100 同上 同上 同上 batch_size=100;默认案例为 50
selection 800×8 50,000×200 200,000×1,000 完整 MarsStatsSelector.fit,默认筛选步骤与阈值
linear_selection 400×8 3,000×40 5,000×80 真实 MarsLinearSelector.fit,含默认可用诊断
score_cross / wide50 / wide500 2,000 行 1,000,000 1,000,000 cross_scores,7 个必要列,加 0/50/500 个真实无关列
optimal_binning 1,000×4 5,000×10 10,000×20 独立监督分箱 workload,不与基础算法混算
profile_columns / binning_columns 800×8 50,000×3,000 同 standard 显式单独扩列
profile_rows / binning_rows 800×8 1,000,000×100 同 standard 显式单独扩行

500、1,000、3,000 特征分别保存 124,750、499,500、4,498,500 对完整关系。短名约 5 字符, 长名约 69 字符;完整候选顺序、相关系数符号、真实对角和 unavailable 保留,未改成 top-k 存储。 注入矩阵的缺失处理明确为 NumPy NaN 传播;真实 selector 的样本范围、表示和缺失处理由报告参数记录, 两条路径不能混称完整筛选性能。

分析宽表来自 8 个潜变量与噪声,混合 float32/float64(每 5 列一列 float64),少量常量和低基数; 按确定位置注入 NaN、-999 和合法 0。主/辅标签分别约 1/19 与 1/7 未表现,4 个真实客群分组, 均匀正权重、金额和重复客户。交叉分数额外包含 ±inf;画像只测其现有支持能力,权重与金额用于 评估和交叉入口。固定每列 RNG,使扩宽时必要列、标签和权重不变,避免把宽度变化混为数据变化。

规则统计包含两轮同 ID 审计、单/多特征、入选/淘汰、train/validation、两个标签及客群切片。 32 个长英文身份对应多个业务 data_source 和重复中文显示名。rule_report 输入始终为 Polars 合成统计,requested backend 两侧是重复消费诊断,不能解释为原始 Pandas/Polars 挖掘对比。 真实规则与宽表入口才有实际输入后端对照。结果表后端及体积逐表记录;Pandas 输入产生 Polars 报告时 仍标记为 Polars 表,避免混淆。

已解决的问题与正确性证据

已完成的报告 large 对照

下面为两侧各三轮的中位耗时和最高阶段观察 RSS,展示 Polars 输入列;另一后端的所有轮次也保留。 规则合成统计不作后端性能比较。原始报告表完全一致;参考规则案例因 5,000 字符空证据整体 failed, 表中仅引用其已完成的构造阶段,不将部分成功称为案例通过。

场景 参考构造 s 当前构造 s 参考阶段峰值 MiB 当前阶段峰值 MiB 当前表存储 MiB 快照 MiB
50,000 行规则审计 1.554 1.452 1246.1 1223.6 198.8 14.59
3,000 特征短名,4,498,500 对 2.378 0.321 1072.0 597.1 108.4 65.73
3,000 特征长名,4,498,500 对 3.429 0.303 3973.3 606.2 108.6 66.90

长名关系构造阶段 RSS 下降约 84.7%,中位耗时下降约 91.2%;这是原生 Enum 构造的诊断收益, 不等于完整 selector.fit 或整个报告消费链路的收益。规则构造变化小,不宣称稳定提速;投影修复的 直接证据为未入选统计不再完整展开为 Python 字典。

当前场景 保存 s 新进程冷加载 s 有限页 ms 5k 上下文 ms 16k 上下文 ms 有限 HTML ms
50,000 审计 0.129 0.097 14.6 23.8 17.0 14.5
3,000 短名 0.128 0.167 12.1 35.4 31.0 170.5
3,000 长名 0.113 0.175 11.6 36.5 27.6 152.4

规则审计的去重 ID 为 33,333,桥接 44,444 行、evaluation 399,996 行、slices 799,992 行; 后部来源交集查询返回 20 / 2,088 行,next_offset=40,5k 保留 1 行、16k 保留 20 行。 相关性后部查询返回 20 / 2,999 行,next_offset=40;固定 1,500 行矩阵计算另记为约 0.14–0.16 秒。 全流程规则主进程最高观察约 2271 MiB,包含生成合成统计时的大量 Python 行;相关性全进程主进程 峰值应取阶段与旁路采样的最大值(约 606 MiB),含独立消费者的进程树约 1154 MiB。 旁路采样和阶段采样可能漏到不同瞬时峰值,不能只选较小的旁路数值。

首次查询和父进程等待消费者时的 RSS 有少数 20%/15% 触发项,原始 comparison 保留;复核结果 单列,不用构造收益掩盖消费成本。新 5k 有效证据与参考空输出不作速度收益比较。

真实公共分析入口与分维度扩展

standard 两侧各三轮,以下为当前 public_compute 中位秒数、最高阶段主进程 RSS;时间已经包含 入口内部报告装配。画像和分箱均为 50,000×200;交叉为百万行。表体积按实际报告后端估计。

standard 案例 Pandas 计算 s / RSS MiB Polars 计算 s / RSS MiB Polars 表 MiB / 快照 MiB Polars 冷 load ms / 页 ms
画像 batch50 0.888 / 371.1 0.757 / 370.2 0.115 / 0.121 41.3 / 0.70
画像 batch100 0.897 / 418.5 0.736 / 413.1 0.115 / 0.121 36.8 / 0.86
基础分箱 batch50 1.560 / 790.8 1.467 / 774.0 2.658 / 1.412 47.2 / 0.76
基础分箱 batch100 1.566 / 1134.6 1.511 / 1142.7 2.658 / 1.415 63.2 / 0.75
统计筛选(资源继承修复后) 20.387 / 776.3 20.308 / 795.9 0.076 / 0.104 见原始轮次
线性筛选 3,000×40 0.861 / 250.3 0.837 / 253.1 0.036 / 0.050 33.7 / 0.47
交叉:必要列 0.266 / 647.9 0.165 / 501.0 0.148 / 0.116 32.9 / 2.10
交叉:加 50 列 0.277 / 889.4 0.202 / 722.6 0.148 / 0.116 37.7 / 2.32
交叉:加 500 列 0.290 / 2948.6 0.172 / 2821.8 0.148 / 0.116 38.9 / 1.93
监督分箱 5,000×10 6.573 / 260.4 6.621 / 257.0 0.088 / 0.103 39.2 / 0.69

统计筛选两个后端均保持 200 个输入 → 50 个相关性候选 → 50 个入选身份及顺序;画像一次、 评估一次且复用已拟合 binner、矩阵一次。线性筛选 40→40,但确实执行默认相关性及可用的 VIF/Logit 诊断。具体预筛漏斗和最终英文顺序保存在每轮 JSON。

交叉的实际必要输入为 Pandas 100.1 MiB / Polars 46.0 MiB,加 500 列为 2389.0 / 2334.8 MiB; 差异包含 Pandas 客群字符串表示。拦截转换确认主样本只传 7 列、半样本参考只传 2 个分数列; 每轮两次轴拟合、一次联合聚合同时处理 bad/late。报告及固定分段政策回放一致。 原始宽表准备约 8 秒,逐轮值见 JSON,不能用约 0.2 秒计算入口隐去准备成本及约 2.8 GiB RSS。

large 分析和扩维每案例只有一轮测量加独立预热,下面是单次观察,不能视为稳定分布。 本轮扩维使用 Polars;除与 standard 相同的百万行交叉外,large Pandas 分析仍未验证。

案例与实际输入 计算 s 计算阶段主进程 RSS MiB 表 MiB / 快照 MiB 状态
画像 200,000×1,000,batch50 12.546 1495.1 0.575 / 0.446 passed
同上 batch100 12.451 1704.8 0.575 / 0.446 passed
基础分箱 200,000×1,000,batch50 24.958 3246.1 13.320 / 6.707 passed
同上 batch100 25.192 5508.7 13.320 / 6.725 passed
统计筛选 200,000×1,000(修复后) 124.625 4234.7 0.934 / 0.760 passed
画像单独扩列 50,000×3,000 13.139 1149.2 1.725 / 1.257 passed
分箱单独扩列 50,000×3,000 50.427 1858.7 40.031 / 20.395 passed
画像单独扩行 1,000,000×100 6.749 1816.0 0.058 / 0.083 passed
分箱单独扩行 1,000,000×100 10.759 5208.0 1.321 / 0.734 passed
线性筛选 5,000×80 3.649 259.9 0.107 / 0.100 passed
监督分箱 10,000×20 10.415 284.9 0.193 / 0.155 passed

large 的百万行交叉三个宽度也各完成一轮(计算 0.162–0.183 秒),尺寸与 standard 相同, 不能将其算作新增行数容量。large 统计筛选为 1,000→250→250,保留完整相关性证据和最终顺序。

基础分箱 batch100 在本机没有时间优势,standard 阶段主进程峰值比 batch50 增加约 48%,large 由 3246 MiB 增到 5509 MiB。建议同类分组、权重和基准配置从 50 开始;这不是跨机器、指标或 算法的最优参数保证。50,000×200 的两个后端另外比较所有报告表,按业务键对齐,浮点容差 1e-8, 全部通过;原生表哈希的细小浮点归约差异没有被误判为统计变化。

筛选预算失败与修复

首次 large 筛选预热在 public_compute 约 45 秒被采样保护终止,退出码 15,主进程峰值 4010 MiB、进程树峰值 8193 MiB;状态为 memory_budget_exceeded,计划测量轮次为 not_run。 日志显示画像、粗筛及精筛预分箱已完成,没有将该退出猜作操作系统 OOM 或正常无规则。

源码确认精筛没有把 selector 的 n_jobs=4 传给最优分箱器,后者使用默认 -1 启动 loky 进程池。修复为默认继承 selector 的配置,显式 binning_params['n_jobs'] 仍优先;没有减少 候选、取消精筛或调整阈值。与首次失败同输入、同 harness、同预算的复跑完整通过,计算 124.625 秒, 阶段进程树峰值 5378.5 MiB,主进程 4234.7 MiB;只有一轮,不据此宣称稳定容量或提速比例。 原始失败和修复后复跑分别保存。

standard 原参考 Polars 计算中位 17.999 秒、修复后 20.308 秒,约增加 12.8%;Pandas 18.568→20.387 秒,约增加 9.8%。这是执行既有资源限制的吞吐权衡,没有宣称速度收益。 精筛任务并发是进程数,4 线程环境控制的是各计算库单进程线程,两者需要分别理解。 独立数值核对记录精筛 binner 实际 n_jobs 从 23 变为 4。 独立最优分箱诊断保留原公共入口的默认进程配置;不能将所有场景解释为全进程树仅有四个线程。

实施范围

  1. 完整相关性报告曾将长名展开为平方级 NumPy Unicode 数组再转 Enum。现在由原生整数端点 直接转既有 Enum 类型,相关值与状态由 Polars 构造,保留所有关系、schema 和顺序;没有快照格式变更。
  2. 规则解释曾将全部验证命中统计转 Python 字典,然后筛入选 ID。现在先在原生表中筛选,只展开 需要的入选规则;候选、审计和切片完整保留。测试拦截 to_dicts,确认只转换 5 条解释所需统计。
  3. 5,000 字符上下文曾删光证据却返回正常 JSON。现在按保留行关联裁剪无关业务元数据,重复 null 定义在表级存一次,优先裁剪可继续查询的说明导航,每个非空查询至少保留一条完整证据。 必需口径和一条证据无法共存时明确拒绝。既有完整 describe 与快照元数据保持原样。

上下文预算为最终 Unicode 字符数,测 5,000、16,000,并独立记录 512 的明确拒绝。45 列完整规则 评估在 7,000 字符下无法保留一条完整证据,会明确拒绝;投影所需列后可产生有效证据。 省略原因、行数及继续查询定位都在原始 JSON 中,空证据不能算 passed。

小规模数值参考包含 NumPy 有效值均值,独立的已表现标签/权重/坏样本/金额合计(rtol/atol 1e-6), 交叉样本数和已表现分母精确整数检查,signed 子矩阵 1e-12。其他统计口径由定向与基础回归覆盖。 规则 sources 筛选验证特征与来源命中同一规则的不同成员,统计行不展开;不同轮次同 ID 保留审计粒度。 无候选、全部淘汰、有候选未入选的状态都保存后在新 Python 中查询,并保留高级关系 not_computed 状态。

每个成功案例 save 后另启解释器,仅提供快照、查询配置与源码安装位置。该解释器不导入 workload 模块,也不调用数据生成、拟合或挖掘,逐表验证数据/schema/顺序、report_id、describe 和有限引用回放。 相关性还恢复 30×30 矩阵和 20 个关联特征;交叉报告查询 cells、显示有限矩阵并回放固定分段政策。 query_page 为 limit=20,包含后部 offset、投影、筛选与排序;只对筛选后的有限页进行 Python/JSON 展开。 完整 HTML/Excel 只在少数 smoke 小报告执行;平方级报告只展示有限表或 30×30 矩阵。

同进程重复消费和资源边界

每个独立消费者先预热,再至少 10 次 load → query_page → context → release,逐轮记录三种延迟和 RSS。 独立冷加载延迟与同进程重复分开。内存池可能保留 RSS,不要求 del 后归零;比较后半段范围与逐轮 轨迹,持续增长才进一步定位引用或缓存,不据一次末值判定泄漏。

3,000 长名额外重复 100 次:释放后 RSS 首轮 593.5 MiB、末轮 617.5 MiB、最高 621.0 MiB; 每十轮平均值为 603.2、610.2、606.0、611.1、612.4、605.4、613.8、612.4、611.9、613.0 MiB。 本次观察符合内存池逐渐进入波动平台,没有后半段持续单向增长;仍不能证明任意长会话不存在泄漏。

large 短名首次页的 20% 触发项复测三轮,参考 10.57/17.98/20.32ms、当前 10.28/13.88/22.03ms,没有复现中位耗时退化;等待消费者时父进程 RSS 的约 16% 增量仍存在, 属于不同构造路径之后的保留分配,应计入总预算。规则首次页复测中位 14.64→18.04ms(约 +23%) 仍触发复核;独立消费者中位 20.94→13.45ms,不用这一结果抵消首次页变化。 分页生产实现未变,三个样本仍有明显噪声,因此保留该限制,未宣称消费全面提速。 standard 少数毫秒级保存、准备、哈希与首次页也触发比例线,原始值和触发项完整保留, 未逐项扩大复测,不能据比例单独认定稳定退化或已消除退化。

超时诊断使用 0.05 秒预算,准确记为启动阶段 timeout;1 GiB 参考长名矩阵触发构造阶段 memory_budget_exceeded;512 MiB 配置对大画像/分箱保守预估为 not_run,未分配宽表。 这些是保护机制验收,与 5k/16k 的有效证据成功、512 字符的明确拒绝分别记录。 large Pandas 新增规模、超出上述规模及真实业务数据没有运行,本轮选择标准双后端后用单后端逐维扩展, 不将未运行项描述为资源超限,也不由较小规模推断通过。

建议从 smoke、standard 推进,显式设置本机预算。有限查询与排序仍可能扫描完整原生关系表, 不承诺恒定时间。批量 50/100 的结论只适用于本页固定 dtype、分组、基准与指标配置,不进行无限搜索。 默认 30×30 展示与 20 行分页是消费范围,完整关系仍在报告中。监督算法单独列出,不以关闭原本 应运行步骤或改变阈值取得性能收益。

时间中位数增长超过 20% 或计算阶段最高观察 RSS 增长超过 15% 只触发复核;先看每轮、阶段与 样本规模,再在相同 workload 下复测。不用采样预算承诺永不瞬时超限,也不将异常退出猜作 OOM。 较小规模通过不能替代未运行、更大规模或其他机器的验证。

CI 与复现限制

普通 CI 增加三个独立 report smoke(规则报告、相关性、交叉宽表投影);结构、版本隔离、 预算终止与跨进程消费检查在基础测试套件运行。large 不在 push 上执行,统一 CLI 可手动运行。 Python 3.8–3.12 核心边界不变,Agent 保持 >=3.10;外部快照消费不依赖 mars.agent 或模型服务。 大型宽表、Parquet、快照与导出都在拥有的临时目录,结束清理,不纳入仓库。

本轮修改报告构造、有限上下文、解释投影和精筛资源参数继承;暂停模块没有新功能, 也没有为其新增旧入口别名。

回归结果:Python 3.10 基础套件 708 passed、1 skipped、7 deselected;Python 3.8 冻结依赖基础套件 583 passed、11 skipped、7 deselected,Agent 测试按版本隔离; Python 3.12(Pandas 3.0.3、Polars 1.42.0)报告、规则、交叉、批次和筛选定向套件 127 passed、 1 deselected。没有可用 Python 3.9 解释器,其语法按 3.9 AST 检查、CI 保留真实版本矩阵, 不能描述为本机完整运行过 3.9。Ruff、154 个生产文件的 Mypy、公共与私有 docstring 检查、 严格 MkDocs 构建通过;私有 docstring 检查仍有六条既有提示。

2026-10-02 审查修复验证

本节记录 b73491c80617c24767f289921cc7924f71c9737f 上的本轮修复工作树, 与前文 2026-10-01 的性能记录分别保留。开始时本地 HEAD、远端 main 一致,工作树干净; 没有覆盖后续提交,也没有修改历史结果 JSON。原 Linux CI 的两个 worker 用例曾把被 psutil 提前回收的直属进程记为退出码 0;本轮由 Popen 独占直属进程的回收。

行为回归先确认缺陷,再验证最终行为:

场景 修复后的实际结果
受控正常/异常退出 分别保留退出码 0/7,异常退出与预算判定分别记录
timeout/memory_budget_exceeded Windows 实测退出码 1、exit_status=known;后代停止、无残留 PID,deliberate_wait 阶段与诊断保留;不固定 Linux 信号码
重复值右闭最小箱复现 切点由共享左闭 [2.0] 转为参考样本真实前值 [1.0];最终正常箱人数 4、6,actual_n_bins=2,约束诊断为 satisfied
自定义 inf/-inf 缺失 首算、提取直接复用、相同配置显式复用,以及保存后新进程加载复用均为正常箱 2、missing 1、invalid 0;统计与政策回放相同
key/feature 同列快照 Polars/Pandas 保存前后均能筛选、分页和生成证据;最小复现证据为 feature=x, mean=2.0,原统计行不展开

最小箱检查仅针对拟合参考样本。显式切点和固定定义复用保持固定,OOT 不重新约束占比。 无法完成约束的拟合保留失败/未满足诊断。默认 native 分箱原本未开启 merge_small_bins 的路径不增加边界适配扫描,既有容量 workload 的计算路径与报告形状未改变。

本地环境为 Windows 11、Intel i7-14650HX(24 个逻辑处理器)、约 63.7 GiB 内存。 各解释器使用当前源码;Python 3.8 的 psutil 7.2.2 从现有环境复制至临时依赖目录, 使用其兼容 ABI,不卸载或替换系统依赖。Python 3.10 的 DLL 导入需在获准的沙箱外进程执行。

基础套件命令为 python -m pytest -q -m "not docs_ml and not optional_ml", 同时指定独立临时目录、禁用 pytest 缓存。Python 3.10 指定 tests 收集目录, 避开既有忽略产物的目录 ACL;仓库所有测试文件均位于该目录。

Python Pandas/Polars 最终基础套件
3.8.20 2.0.3/1.8.2 706 passed、13 skipped、7 deselected
3.10.19 2.3.3/1.37.1 833 passed、1 skipped、7 deselected
3.11.15 3.0.3/1.42.0 793 passed、5 skipped、7 deselected
3.12.13 3.0.3/1.42.0 795 passed、3 skipped、7 deselected

不同环境安装的可选依赖不同,适用用例数因此不同。基础套件后补强的 worker 清理诊断 在四个版本各重跑 tests/test_core_capacity_benchmark.py,均为 35 passed。 Python 3.12 的五个 Score Cross 定向模块为 113 passed,四个报告/规则/快照定向模块为 91 passed。最后补强的非有限缺失配置复用回归为 2 passed;四个导出临时目录用例也已复验。 初次并行运行基础套件暴露了四个旧导出测试共享 tests/_artifacts 的竞态,现改用各自 tmp_path 并保留原断言;错误源码搜索路径和目录权限造成的早期运行失败分别纠正后重跑, 未把这些失败计为通过,也未削弱原有业务断言。

统一容量入口实际执行以下 smoke,均包含独立预热、测量、保存和冷消费者验证:

python benchmarks/benchmark_core_capacity.py --case rule_report correlation_short --backend polars --scale smoke --repeats 1 --output <tmp>/report-smoke.json
python benchmarks/benchmark_core_capacity.py --case score_cross linear_selection --backend pandas --scale smoke --repeats 1 --output <tmp>/analysis-smoke.json

四个案例全部 passed。线性筛选实际执行 VIF/系数各 8 行,statsmodels 0.14.6 成功导入; 关闭的 stepwise 分支明确记录跳过。另以原提交源码和修复源码执行相同 correlation_short / polars / smoke 对照,七个阶段均为 comparable, 表内容、schema 与顺序摘要一致,源码溯源哈希变化不会误拒绝。 这是一轮正确性与比较工具验收,不能据此宣称提速。

同一解释器内受控模拟 statsmodels 导入失败,400×8 输入的 VIF/系数由各 8 行变为 跳过且为空;比较结果为 incomparable,保留依赖与诊断差异原因,不输出常规耗时比例。 workload、有效参数、测量合同和实际参与依赖变化均有拒绝回归;明确比较目的的资源策略 变化单独标记。执行失败、语义不一致与不可比较分别报告。旧基线缺少新兼容字段时说明 信息不足;已发布正式线性对照两侧的诊断均为 available,原数字未重写或宣布失效。

Ruff 全范围检查、Mypy(157 个生产文件)、公共 pydoclint、私有 docstring 检查及 严格 MkDocs 构建通过;私有检查保留六条既有提示。git diff --check 通过。 离线探索器的实际 Node JavaScript 行为测试随定向/基础套件执行;未做真实浏览器交互验收。 本轮没有无条件重跑 standard/large,未新增大型二进制产物或重做历史性能结论。

原始日志、smoke JSON、对照 JSON、参考源码与站点构建保存在本机独立临时目录 mars-review-20261002-l9zhqkcb;Python 3.10 的运行使用独立临时目录。 没有本地 Python 3.9 或普通 Linux 环境;随后通过下面的远端运行补齐,不能将其写成本机通过。 本地没有单独执行 docs_ml/optional_ml 标记套件。

远端 Linux CI 补验

修复提交 a99e0fc53f0864936a5e8200034df4838ad75ec7 已推送到独立分支 codex/review-fixes-capacity-20261002,见 草稿 PR #2。 现有 Ubuntu CI run 36910816160 的 11 个任务全部 success,没有取消或跳过版本矩阵:

Python CI 基础套件
3.8.18 710 passed、13 skipped、7 deselected
3.9.25 710 passed、13 skipped、7 deselected
3.10.21 799 passed、3 skipped、7 deselected
3.11.16 799 passed、3 skipped、7 deselected
3.12.14 799 passed、3 skipped、7 deselected

五个版本均实际执行最终 worker 回归,原 timeout/memory_budget_exceeded 用例保留 真实 known 非零退出状态、后代不再运行和诊断保留断言。日志没有打印具体操作系统退出码, 因此不推断或写死 Linux 信号码。规则、相关性、模型分交叉的隔离容量 smoke 全部 passed; quality、modeling(110 passed)、distribution、两版 installed-wheel smoke 也全部 success。 Docs run 36910816417 为 43 passed,严格构建通过;PR 条件下部署任务 skipped,未部署站点。 本地基础套件与远端依赖组合不同,以上各自记录实际通过数,不用其中一组替代另一组。

原始结果索引

结果在 benchmarks/results/,每轮值、预热、环境、实际参数和拒绝结果都保留。 合并文件的 source_runs 记录各真实调用的参数与原文件哈希,表示多次串行调用的归档, 不能解释为一次总耗时。调试失败的简短索引在 diagnostics,正式基线和实际预算失败不被删除。

JSON 内容
core_capacity_baseline_initial.json 首次生产优化前的 standard 报告基线,三轮值
core_capacity_smoke_verified.json 全部 smoke、双输入后端、独立预热与测量,34 个组合通过
core_capacity_standard_reference.json 同环境参考源码:报告与真实分析全部 standard
core_capacity_standard.json 当前全部 standard:34 个组合,三轮,筛选资源修复后结果
core_capacity_large_reports_reference.json 50k 审计、3k 完整关系及真实小挖掘链路参考
core_capacity_large_reports.json 同场景当前结果、十个组合、三轮、完整报告语义对照
core_capacity_large_analysis.json large/扩行/扩列、原始筛选预算失败及修复复跑
core_capacity_diagnostics.json 桥接、跨快照版本、超时/预算/not_run、消费复测、100 次释放、完整批次与筛选数值核对
core_capacity_validation.json 实际验证命令、版本、通过数和检查结果

批次与筛选的独立数值核对代码随 diagnostics 的 verification_script 保存,仅生成标准规模 验证证据;外部快照消费者不导入这些代码。快照、原始宽表及导出产物均未保存到仓库。