@@ -45,7 +45,7 @@ cargo build
4545
4646* ** 特性** : datamash 提供大量逐行转换操作,无需分组即可使用:
4747 * ** 数值修约** : ` trunc ` , ` frac ` 。
48- * ** 文件路径处理** : ` dirname ` , ` basename ` , ` extname ` , ` barename ` 。
48+ * ** 文件路径处理** : ` dirname ` , ` basename ` , ` extname ` , ` barename ` 。abspath
4949 * ** 数值提取** : ` getnum ` 从混合文本中提取数字(如 "zoom-123.45xyz" -> 123.45)。
5050 * ** 分箱** : ` strbin ` (字符串哈希分箱)。
5151
@@ -67,13 +67,53 @@ cargo build
6767
6868#### 1. 并行处理架构 (Parallel Processing)
6969
70- * ** 实现** : ` cmd/parallel.rs `
71- * ** 机制** : 类似于 Map-Reduce。它不试图让每个命令内部并行化,而是提供一个通用的 ` parallel ` 子命令。
72- * ** Chunking** : 自动将文件分块,或按文件分发任务。
73- * ** Shuffle** : 保证输出顺序与输入一致(如果需要)。
74- * ** 对 ` tva ` 的启示** :
75- * ` tva ` 目前是单线程流式处理。
76- * ** 建议** : 实现 ` tva parallel ` 命令,负责将大文件切分 (利用 ` split ` 逻辑) 并启动多个子进程/线程处理,最后聚合结果。
70+ * ** 实现** : ` cmd/parallel.rs ` (~ 1600 行)
71+ * ** 核心设计** : 采用 ** "External Parallelism"** 模式,不修改单个命令的内部实现,而是通过一个通用的 ` parallel ` 子命令来并行化任意操作。
72+
73+ ** 关键机制** :
74+
75+ 1 . ** 任务分发策略** (线程分配算法):
76+ * 当输入文件数 >= 线程数时:每个文件一个任务
77+ * 当线程数 > 文件数时:利用 CSV/BGZF 的 seek 能力将大文件切分为多个 ` FileChunk `
78+ * 通过 ` simd_seeker().segments(t) ` 实现基于字节偏移的精确分块
79+
80+ 2 . ** 预处理管道** (两种模式):
81+ * ` -P, --preprocess ` : 使用 xan 子命令管道 (如 ` "search -s name John | slice -l 10" ` )
82+ * ` -H, --shell-preprocess ` : 使用 shell 管道 (` $SHELL -c ` ),更灵活但 Windows 不支持
83+
84+ 3 . ** 子命令实现** :
85+ * ` count ` : 行数统计 (支持 ` --source-column ` 输出每个文件的计数)
86+ * ` cat ` : 并行预处理并合并结果 (带缓冲区控制 ` --buffer-size ` )
87+ * ` freq ` : 并行频率统计,使用 ` Counter ` 数据结构合并结果
88+ * ` stats ` : 并行统计计算,使用 ` Stats ` 结构合并
89+ * ` agg ` /` groupby ` : 并行聚合,使用 ` AggregationProgram ` /` GroupAggregationProgram `
90+ * ` map ` : 并行处理并输出到指定模板文件 (如 ` '{}_freq.csv' ` )
91+
92+ 4 . ** 进程管理** (` ProcessManager ` ):
93+ * 使用 ` rayon ` 线程池进行并行执行
94+ * 支持进度条 (` indicatif ` 的 ` MultiProgress ` )
95+ * 子进程错误捕获和优雅退出 (通过 ` Children ` 结构管理)
96+
97+ 5 . ** 数据合并模式** :
98+ * ** 计数/求和型** : 使用 ` AtomicU64 ` 或 ` Mutex<BTreeMap> ` 合并
99+ * ** 频率表型** : ` FrequencyTables::merge() ` 合并多个 ` Counter `
100+ * ** 统计型** : ` StatsTables::merge() ` 合并 ` Stats ` 结构
101+ * ** 分组聚合型** : ` GroupAggregationProgram::merge() ` 合并分组结果
102+
103+ ** 对 ` tva ` 的启示** :
104+
105+ * ** 优势** :
106+ * 无需修改现有命令代码即可并行化
107+ * 利用 SIMD CSV 解析器的 seek 能力实现文件分块
108+ * 支持 BGZF 索引文件的高效随机访问
109+ * ** 挑战** :
110+ * 需要处理 header 在分块后的正确传递
111+ * 输出顺序控制 (` cat ` 命令的 ` --buffer-size ` )
112+ * 错误处理和子进程管理复杂度较高
113+ * ** 建议** :
114+ * 第一阶段:实现基于文件粒度的并行 (类似 ` xan parallel count *.tsv ` )
115+ * 第二阶段:结合 ` tva split ` 实现大文件分块并行
116+ * 利用 TSV 无引号特性,可以比 CSV 更简单地实现字节级分块
77117
78118#### 4. 随机访问与索引 (Random Access & Indexing)
79119
@@ -130,18 +170,6 @@ cargo build
130170* ** 价值** : 在数据清洗(ETL)场景中,批量关键词匹配和替换是刚需。
131171* ** 建议** : 增强 ` tva filter ` 或新增 ` tva search ` ,集成 ` aho-corasick ` crate 以支持高性能的多模式匹配。
132172
133- #### 3. 表达式语言设计 (Moonblade 分析)
134-
135- ` xan ` 的 ` moonblade ` 表达式引擎设计精良,以下是值得 ` tva ` 借鉴的关键特性:
136-
137- ** 3.2 待添加的函数**
138-
139- 以下函数尚未实现,可参考 ` xan ` 添加:
140-
141- | 函数类别 | 函数名 | 功能 | 优先级 |
142- | :---------| :-------------------------------| :-----| :----|
143- | ** 文件路径** | ` abspath ` /` dirname ` /` basename ` | 路径处理 | 低 |
144-
145173## tva 与 xan 命令对比分析
146174
147175通过对比 tva 和 xan 的命令集,以下是 tva 尚未实现但可能有价值的功能:
0 commit comments