Files
Just-DataInspector/Utilities/Inc/DataLoader.hpp
T
DeepSeek-V4.1-Flash f44f8021e3 Release 产物 1.74MB → 796KB(去掉 <filesystem> 与 zlib)+ .mat 加载进度不再停住
一、体积膨胀的真因(用 -Wl,-Map 逐对象/逐节对比上一提交定位,只有两个)
1) <filesystem>(致命,约 +900KB):MatH5::Open 用 std::filesystem::file_size 取文件大小,
   MinGW 的 libstdc++ 因此链入 fs_path/fs_dir/fs_ops/c++locale/codecvt/collate_members/
   cow-wstring-inst/cxx11-wlocale-inst/fstream-inst/cp-demangle 整套 locale/iostream 机器
   (归档成员 415→538);还把 64KB 静态表从 .bss 挤成 .data(1.8KB→73.8KB)。
   修法:改用 _wfopen_s + _fseeki64/_ftelli64 取大小。
2) -lz(约 46KB):只需要"解开 HDF5 分块"。修法:MatH5 内置紧凑 inflate
   (RFC1950/1951:固定/动态 Huffman、存储块、长度-距离回抄),Makefile 与探针脚本移除 -lz。
顺带把 UploadHaloLayer 里 64KB 的预乘 alpha 查表换成 (v*a+128)*257>>16(无除法、无表)。

二、压到 800KB 以下的两项无损措施
1) 图标资源无损重编码:ico 里 64/48/32/16 四帧原为未压缩 32bpp DIB(合计 32KB),
   用自写工具(GDI+ 编码)改为 PNG 帧(ICO 的 PNG 条目 Vista+ 全支持,本文件本就有 256 PNG 帧):
   43,334 → 17,404 字节。像素逐点校验:差异 ≤85 像素、最大分量差 ≤3(编码取整),肉眼不可辨;
   并从**真实产物** LoadImageW 逐尺寸(16/32/48/64)验证可加载。
2) RELEASE_OPT 由 -Os 改为 -Oz(省约 6KB);实测动画帧 p50 7.73ms(-Os) vs 7.77ms(-Oz),
   无可辨识差异。
放弃的手段:-ffunction-sections/-fdata-sections + --gc-sections(反而 +9KB)、LTO(工具链 ICE)、
-fno-asynchronous-unwind-tables(链接失败)、-fno-exceptions(会破坏 catch (bad_alloc))。
结果:Build/Release/Target.exe = 795,648 字节。

三、.mat 加载进度不更新(已加载大小 / 总大小 / 百分比都停在 0)
真因:LoadMatSourceGroups 只在结束时回调一次 ratio=1.0,且从不设置 hasBytes;
读 42MB 文件与解码 19 个样本流(解压+拷贝,占大头)期间进度恒为 0。
修法:
- MatHdf5::Open 新增 OpenProgress(bytesRead,totalBytes),按 4MB 分块读取并回报;
- MatLoader 用 ProgressReporter 把进度拆成 0.00–0.55 读文件(hasBytes=true)与
  0.55–0.98 解码样本流(每解完一个流推进 done/total),末段 1.0;
- 取消与出错分开:取消时清空 error,不弹错误框。
实测:回调 29 次、字节数变化 11 次、比例单调、终值 1.000、bytes=42,386,344/42,386,344
(= 文件大小);Application 侧断言 m_loadingBytesRead == m_loadingTotalBytes == 文件大小。

四、验证(全部离屏,不占用鼠标/键盘/屏幕)
- matcheck 21/21(新增进度断言)、matui 15/15(新增图标 + 加载字节断言);
- 回归 verify 49/49、panelanim 158/158、gridanim 93/93、hoverdrag 20/20、lanescroll 23/23、
  datacheck 69/69、edgecheck 46/46、errcheck 19/19、halocheck 16/16、panflash 19/19、
  panelstutter 8/8、stress 6/6;
- make release / make debug 零警告。

文档:Documents/agent_mem.md 追加本轮小节(含 5 条新规则:MinGW 下 <filesystem> 是体积炸弹、
链一整条库前先算账、膨胀要看节表而非 .o 大小、图标可无损重编码并用产物校验、
长解析必须按阶段回报进度且 hasBytes 只在有字节时置真)。
2026-10-19 02:37:52 +08:00

75 lines
2.9 KiB
C++
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.
#ifndef __DATA_LOADER_HPP__
#define __DATA_LOADER_HPP__
#include <string>
#include <vector>
#include "DataTable.hpp"
namespace jdi
{
/**
* @brief 一个文件加载后的**命名分组**(多数格式只有一个,名字取文件名)。
*/
struct LoadedSourceGroup
{
std::wstring name; /**< 分组名(空表示"用源文件名")。 */
LoadedSource source; /**< 该分组的数据。 */
};
/**
* @brief 判断路径是否为应用当前支持的测量文件(按扩展名判断,不访问文件内容)。
* @param [IN] filePath 文件路径。
* @return 支持返回 true。
*/
bool IsSupportedSignalFile(const std::wstring& filePath);
/**
* @brief 供「打开文件」对话框使用的过滤器文本(`GetOpenFileNameW` 的 `lpstrFilter` 格式)。
* @return 双 NUL 结尾的过滤器文本。
*/
const wchar_t* SignalFileDialogFilter();
/**
* @brief 按扩展名选择加载器并读入一个测量文件(**唯一的文件加载入口**)。
*
* 上层(数据模型与界面)只依赖本函数返回的 `LoadedSource`,因此新增格式时
* **只需新增一个加载器并在这里登记**,其余代码完全不用改。
*
* 当前支持的格式:
* * CSV 文本(`.csv` / `.txt`):支持多个 `time` 列(多时间轴)与各时间轴不等长;
* * ASAM MDF v4(`.mf4` / `.mdf`):每个通道组(CG)是一个时间轴;
* * MATLAB 7.3 `.mat`(HDF5):**可能产出多个分组**(嵌套数据集),因此多分组格式
* 必须走 `LoadSignalSourceGroups`,本函数只取其中的单分组语义。
*
* @param [IN] filePath 文件完整路径。
* @param [OUT] source 解析结果(若干时间轴块)。
* @param [OUT] error 失败原因描述(成功时清空)。
* @param [IN] progress 进度回调,可为空。
* @return 加载成功返回 true。
*/
bool LoadSignalSource(const std::wstring& filePath, LoadedSource& source, std::wstring& error,
const LoadProgress& progress = LoadProgress());
/**
* @brief 与 `LoadSignalSource` 相同,但允许一个文件产出**多个命名分组**。
*
* 绝大多数格式只有一个分组(`groups.size() == 1`,`name` 为空 ⇒ 用文件名)。
* `.mat`(MATLAB 7.3)里的嵌套数据集会产生多个分组:分组名由"从顶层数据集到信号"
* 的路径用 `-` 连接而成(用户 2026-10-18 要求)。
*
* @param [IN] filePath 文件完整路径。
* @param [OUT] groups 读出的分组(至少一个)。
* @param [OUT] error 失败原因描述(成功时清空)。
* @param [IN] progress 进度回调,可为空。
* @return 加载成功返回 true。
*/
bool LoadSignalSourceGroups(const std::wstring& filePath, std::vector<LoadedSourceGroup>& groups,
std::wstring& error,
const LoadProgress& progress = LoadProgress());
} // namespace jdi
#endif // __DATA_LOADER_HPP__