rustgzip 0.5.2__py3-none-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- rustgzip/__init__.py +385 -0
- rustgzip/experimental.py +283 -0
- rustgzip/rustgzip_native.dll +0 -0
- rustgzip-0.5.2.dist-info/METADATA +351 -0
- rustgzip-0.5.2.dist-info/RECORD +48 -0
- rustgzip-0.5.2.dist-info/WHEEL +4 -0
- rustgzip-0.5.2.dist-info/licenses/LICENSE +21 -0
- rustgzip-0.5.2.dist-info/licenses/OPTIMIZATION-030.md +82 -0
- rustgzip-0.5.2.dist-info/licenses/OPTIMIZATION-050.md +119 -0
- rustgzip-0.5.2.dist-info/licenses/PARALLEL-040.md +146 -0
- rustgzip-0.5.2.dist-info/licenses/PROVENANCE.md +43 -0
- rustgzip-0.5.2.dist-info/licenses/README.md +343 -0
- rustgzip-0.5.2.dist-info/licenses/REVIEW-031.md +57 -0
- rustgzip-0.5.2.dist-info/licenses/REVIEW-051.md +90 -0
- rustgzip-0.5.2.dist-info/licenses/UPSTREAM-REVIEW.md +96 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/cfg-if-LICENSE-APACHE +201 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/cfg-if-LICENSE-MIT +25 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/crc32fast-LICENSE-APACHE +202 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/crc32fast-LICENSE-MIT +21 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/flate2-LICENSE-APACHE +201 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/flate2-LICENSE-MIT +25 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/COPYRIGHT-library.html +29357 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/Apache-2.0.txt +73 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/BSD-2-Clause.txt +9 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/CC-BY-SA-4.0.txt +427 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/GCC-exception-3.1.txt +30 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/GPL-2.0-only.txt +133 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/GPL-3.0-or-later.txt +202 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/ISC.txt +7 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/LLVM-exception.txt +15 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/MIT.txt +9 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/NCSA.txt +29 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/OFL-1.1.txt +43 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/Unicode-3.0.txt +39 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-COPYRIGHT-library.html +29357 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/Apache-2.0.txt +73 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/BSD-2-Clause.txt +9 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/CC-BY-SA-4.0.txt +427 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/GCC-exception-3.1.txt +30 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/GPL-2.0-only.txt +133 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/GPL-3.0-or-later.txt +202 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/ISC.txt +7 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/LLVM-exception.txt +15 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/MIT.txt +9 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/NCSA.txt +29 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/OFL-1.1.txt +43 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/Unicode-3.0.txt +39 -0
- rustgzip-0.5.2.dist-info/licenses/third-party/zlib-rs-LICENSE +19 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: rustgzip
|
|
3
|
+
Version: 0.5.2
|
|
4
|
+
Summary: Rust gzip streams for Python 3.4+
|
|
5
|
+
Requires-Python: >=3.4
|
|
6
|
+
License: MIT
|
|
7
|
+
Description-Content-Type: text/markdown
|
|
8
|
+
|
|
9
|
+
# rustgzip 0.5.2
|
|
10
|
+
|
|
11
|
+
给 Python 3.4 及更新版本使用的 Rust gzip 加速包,导入名为 `rustgzip`。
|
|
12
|
+
本版发布稳定 Python 接口,并附带最新 Rust 研究源码;实验多核解压尚未开放 Python 入口,默认路径仍为顺序原生解压。详见 RELEASE-052.md。
|
|
13
|
+
|
|
14
|
+
## 1. 适合解决什么问题
|
|
15
|
+
|
|
16
|
+
适合顺序读取/写入 `.gz`、扫描 gzip 完整性和内存压缩解压。
|
|
17
|
+
Python 负责文件对象适配,Rust 负责 gzip 解析、DEFLATE、CRC32 和文件流循环。
|
|
18
|
+
动态库用 ctypes 加载,不依赖 CPython ABI,不需要 PyO3,不需要安装 isal/based58 等库。
|
|
19
|
+
|
|
20
|
+
生成的是标准 gzip,不是新格式,系统 gzip 和 Python 标准库都能解压。
|
|
21
|
+
支持多个 gzip member 串接及 member 后的零填充;非零尾部垃圾、截断、CRC/ISIZE 错误会报错。
|
|
22
|
+
|
|
23
|
+
## 2. 内网 UOS 安装
|
|
24
|
+
|
|
25
|
+
交付的 `rustgzip-0.5.2-py3-none-linux_x86_64.whl` 用于 **x86_64 Linux**。
|
|
26
|
+
它在 Debian 10 / glibc 2.28 环境构建,并用真实 Python 3.4.10 和 3.7 验证。
|
|
27
|
+
本次没有连接你的内网 UOS;实际发行版兼容性仍以运行结果为准。
|
|
28
|
+
安装后不需要 Rust 编译器,不需要联网。不是 ARM、龙芯或 Windows 安装包。
|
|
29
|
+
|
|
30
|
+
将 wheel 传到内网后执行;根据实际命令名调整 `python3.4`:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
python3.4 -m pip install --no-index --no-deps ./rustgzip-0.5.2-py3-none-linux_x86_64.whl
|
|
34
|
+
python3.4 -c "import rustgzip; print(rustgzip.backend_info())"
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
没有 root 权限时,加 `--user`,或使用 `--target ./py-libs`:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
python3.4 -m pip install --no-index --no-deps --target ./py-libs ./rustgzip-0.5.2-py3-none-linux_x86_64.whl
|
|
41
|
+
PYTHONPATH="$PWD/py-libs" python3.4 your_script.py
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
没有 pip 时,可以解压 `rustgzip-0.5.2-linux_x86_64-portable.zip`,将其中的
|
|
45
|
+
`rustgzip` 文件夹与自己的脚本放在同一目录。文件夹内的 `.py` 和 `.so` 都要保留。
|
|
46
|
+
这是完整的独立包,不需要把整个源码或 vendor 放进内网。
|
|
47
|
+
|
|
48
|
+
## 3. 直接替换你的读取代码
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
import rustgzip as gzip
|
|
52
|
+
|
|
53
|
+
with gzip.open(stage_file, 'rb') as handle:
|
|
54
|
+
while handle.read(1024 * 1024):
|
|
55
|
+
pass
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
如果目的只是确认压缩包是否完整,可以进一步减少 Python 循环:
|
|
59
|
+
|
|
60
|
+
```python
|
|
61
|
+
import rustgzip
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
size = rustgzip.verify(stage_file)
|
|
65
|
+
print('校验成功,解压后大小:%d 字节' % size)
|
|
66
|
+
except OSError as exc:
|
|
67
|
+
print('校验失败:%s' % exc)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`verify` 在 Rust 内部循环,复用 1 MiB 缓冲,不生成解压文件。
|
|
71
|
+
**读取前几块、read(0) 或仅关闭文件,不等于完整性校验;必须完整读到 EOF。**
|
|
72
|
+
|
|
73
|
+
## 4. 其他常用方式
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
import rustgzip as gzip
|
|
77
|
+
|
|
78
|
+
# 二进制写入。with 结束时会写完 gzip 尾部并处理磁盘错误。
|
|
79
|
+
with gzip.open('output.gz', 'wb', compresslevel=6) as handle:
|
|
80
|
+
handle.write(b'hello\n')
|
|
81
|
+
|
|
82
|
+
# 文本写入与逐行读取;Python 3.4 不支持 f-string,因此示例也不使用。
|
|
83
|
+
with gzip.open('text.gz', 'wt', encoding='utf-8') as handle:
|
|
84
|
+
handle.write('中文内容\n')
|
|
85
|
+
with gzip.open('text.gz', 'rt', encoding='utf-8') as handle:
|
|
86
|
+
for line in handle:
|
|
87
|
+
print(line.rstrip('\n'))
|
|
88
|
+
|
|
89
|
+
# 追加会新建一个标准 gzip member,不修改既有 member。
|
|
90
|
+
with gzip.open('output.gz', 'ab') as handle:
|
|
91
|
+
handle.write(b'next\n')
|
|
92
|
+
|
|
93
|
+
packed = gzip.compress(b'hello', compresslevel=1)
|
|
94
|
+
plain = gzip.decompress(packed, max_output_size=16 * 1024 * 1024)
|
|
95
|
+
|
|
96
|
+
# 大文件读取时可复用 bytearray,减少 Python 分配。
|
|
97
|
+
buffer = bytearray(1024 * 1024)
|
|
98
|
+
with gzip.open('output.gz', 'rb') as handle:
|
|
99
|
+
while True:
|
|
100
|
+
count = handle.readinto(buffer)
|
|
101
|
+
if not count:
|
|
102
|
+
break
|
|
103
|
+
# 在这里处理 buffer[:count];需要避免复制时使用 memoryview(buffer)[:count]。
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 5. API 与边界
|
|
107
|
+
|
|
108
|
+
| 接口 | 行为 |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `open(path, mode='rb', compresslevel=6, encoding=None, errors=None, newline=None, buffering=262144)` | 顺序文件流,支持 rb/wb/ab/xb 和文本模式 |
|
|
111
|
+
| `GzipFile(path, ...)` | 路径式便捷函数,不是标准库同名类 |
|
|
112
|
+
| `compress(data, compresslevel=6)` | bytes-like → gzip bytes,级别 0~9 |
|
|
113
|
+
| `decompress(data, max_output_size=536870912)` | 完整解压,默认最多 512 MiB 输出 |
|
|
114
|
+
| `verify(path, chunk_size=1048576)` | 完整校验并返回解压字节数;块大小 1 字节~64 MiB |
|
|
115
|
+
| `backend_info()` | 返回后端、包和 Python 版本,验证动态库是否可加载 |
|
|
116
|
+
|
|
117
|
+
- 支持 str/bytes 路径和现代 Python Path;支持 read/readinto/readline/迭代/write/flush/with。
|
|
118
|
+
- **不是标准库 gzip 的完整替代品**:不支持 seek/rewind、fileobj、fileno、mtime 参数或标准库类继承契约。
|
|
119
|
+
- `tell()` 返回处理后的逻辑字节位置;不能用它设置文件偏移。文本层有自己的位置规则。
|
|
120
|
+
- gzip 时间戳固定为 0,不存源文件名;压缩后的字节不保证与标准库逐字节一致。
|
|
121
|
+
- `flush()` 不是 fsync;成功关闭不等于已经保证断电持久化。
|
|
122
|
+
- `wb` 会截断既有文件,出错可能留下不完整输出。希望防覆盖时用 `xb`;重要输出建议先写临时文件,成功关闭后再由应用原子替换。
|
|
123
|
+
- 读取坏文件可能先得到部分数据,直到 CRC/EOF 检查时报错;不要在校验前把这些数据当成已验证结果。
|
|
124
|
+
- 文件流不限制解压总量;超大/不可信输入应由应用限制处理大小或时间。
|
|
125
|
+
- 内存解压的 max_output_size 限制输出字节数,实际峰值内存还包括输入、Rust 缓冲与 Python 返回副本。
|
|
126
|
+
- Rust 原生调用期间释放 GIL;不同文件流可以由线程并发处理。普通单 member gzip **没有多核并行解压**。
|
|
127
|
+
- 打开流后不要 fork 并复用它;子进程应重新打开自己的流。
|
|
128
|
+
|
|
129
|
+
## 6. 实测性能怎么看
|
|
130
|
+
|
|
131
|
+
`benchmark-linux-py34.json` 是 Debian 10 构建虚拟机、Python 3.4.10、zlib 1.2.11 的结果。
|
|
132
|
+
每类输入 16 MiB,每项测三轮取中位数;文件测试包含操作系统缓存,不是冷磁盘吞吐测试。
|
|
133
|
+
|
|
134
|
+
| 操作 | 本次相对 Python 3.4 标准库 |
|
|
135
|
+
|---|---|
|
|
136
|
+
| 内存压缩 | 约 1.50~3.23 倍 |
|
|
137
|
+
| 内存解压 | 约 2.56~4.62 倍 |
|
|
138
|
+
| open 分块读完 | 约 2.25~4.06 倍 |
|
|
139
|
+
| verify 整文件校验 | 约 3.04~3.82 倍 |
|
|
140
|
+
|
|
141
|
+
输入包含重复日志、变化字段的结构化日志和随机数据;**不能推广为所有文件的速度保证**。
|
|
142
|
+
Windows / Python 3.14 的内存解压测试有些比标准库慢,结果也如实保留在
|
|
143
|
+
`benchmark-windows.json`。不要用旧版 Python 的相对加速比推断新版 Python。
|
|
144
|
+
|
|
145
|
+
在真实 UOS 上复测:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
python3.4 tools/benchmark.py 16 benchmark-my-uos.json
|
|
149
|
+
python3.4 tests/test_api.py
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
完整源码包内有这些脚本;测试使用临时生成的数据,不上传用户文件。
|
|
153
|
+
|
|
154
|
+
## 7. 后端与许可证
|
|
155
|
+
|
|
156
|
+
后端使用公开的 [flate2](https://github.com/rust-lang/flate2-rs) 和
|
|
157
|
+
[zlib-rs](https://github.com/trifectatechfoundation/zlib-rs),开启运行时 CPU 特性检测。
|
|
158
|
+
构建不使用 `target-cpu=native`,避免在不支持本机指令集的 UOS CPU 上直接崩溃。
|
|
159
|
+
未复制 python-isal、python-zlib-ng 或 rapidgzip 实现,也没有将其性能宣传当作本包实测。
|
|
160
|
+
|
|
161
|
+
本项目新增封装为 MIT;依赖许可、版权告知、精确版本和来源说明见
|
|
162
|
+
`PROVENANCE.md`、`THIRD_PARTY_LICENSES/`。源码包附带公开 vendor,可离线构建,
|
|
163
|
+
未包含私有源码、密钥、运行数据或单位资料。
|
|
164
|
+
|
|
165
|
+
## 8. 从源码重建
|
|
166
|
+
|
|
167
|
+
构建需要 Rust 工具链、C 链接器;Python 运行时不需要它们。
|
|
168
|
+
本次验证的 Rust 为 Windows 1.99.0 / Linux 1.99.1。
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
cargo build --release --locked --offline
|
|
172
|
+
# Linux:将原生库放进 Python 包内,然后直接运行测试。
|
|
173
|
+
cp target/release/librustgzip_native.so python/rustgzip/
|
|
174
|
+
PYTHONPATH=python python3.4 tests/test_api.py
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
现代构建环境可运行 `python setup.py bdist_wheel`;较旧 Python 的构建工具已停止更新,
|
|
178
|
+
建议用现代 Python 构建 wheel,再在 Python 3.4 安装。wheel 使用 `py3-none-平台` 标签,
|
|
179
|
+
不伪装成纯 Python 或 manylinux 通用包。
|
|
180
|
+
|
|
181
|
+
`tools/package_release.py --native <动态库路径> --platform linux_x86_64` 可按白名单重打包。
|
|
182
|
+
不要直接压缩整个工作目录;build/target 中的编译缓存不是用户安装依赖。
|
|
183
|
+
|
|
184
|
+
## 9. 0.2.0 新增的缓冲区接口
|
|
185
|
+
|
|
186
|
+
`python
|
|
187
|
+
import rustgzip
|
|
188
|
+
|
|
189
|
+
output = bytearray(32 * 1024 * 1024) # 由应用选择可信的容量上限,可以反复使用。
|
|
190
|
+
count = rustgzip.decompress_into(packed, output)
|
|
191
|
+
result = memoryview(output)[:count] # 视图不复制完整结果;需要 bytes 时再显式转换。
|
|
192
|
+
`
|
|
193
|
+
|
|
194
|
+
容量不足、CRC/格式错误会抛出异常;失败后缓冲中的内容不可使用。
|
|
195
|
+
不要未经限制地根据 gzip 尾部 ISIZE 分配任意大内存,也不要在调用期间由其他线程访问 output。
|
|
196
|
+
|
|
197
|
+
源码学习和与 0.1.0 的逐项性能比较见 [UPSTREAM-REVIEW.md](UPSTREAM-REVIEW.md)。
|
|
198
|
+
本轮主要改善内存解压,文件 verify 没有本质提速,尚未实现普通单流多核解码。
|
|
199
|
+
0.2.0 的原生 ABI 为 2,0.3.0 为 3;0.3.1 / 0.4.0 为 4,后者新增可选并行扩展。
|
|
200
|
+
升级时替换整个包并重启 Python,不能混装 py 和动态库。
|
|
201
|
+
|
|
202
|
+
## 10. 0.3.0 的进一步优化
|
|
203
|
+
|
|
204
|
+
常见头部的内存解压直接使用同版本 zlib-rs 填充 Vec 剩余容量,复杂头部保留原解析器;串接文件跨 member 复用解码状态。API 用法不变,Python 3.4 仍受支持。
|
|
205
|
+
|
|
206
|
+
此次搜索、未采用的方案、性能波动及完整验证见 [OPTIMIZATION-030.md](OPTIMIZATION-030.md)。默认 verify 缓冲不变,普通单流多核解压仍未实现。
|
|
207
|
+
|
|
208
|
+
## 11. 0.3.1
|
|
209
|
+
|
|
210
|
+
修复刷新未到达文件、无效文本参数截断原文件、中断后的原生资源泄漏,以及缓冲扩容重试失败。
|
|
211
|
+
具体复现和修复见 [REVIEW-031.md](REVIEW-031.md)。原生 ABI 为 4,请替换完整包并重启使用它的 Python 进程。
|
|
212
|
+
|
|
213
|
+
Python 3.4 / 3.7 的运行回归各 82 项全部通过;Windows 通过 80 项,跳过 2 项 Linux 专用测试。
|
|
214
|
+
构建工具另有 7 项测试,请用现代 Python 运行 `python tests/test_packaging.py`。
|
|
215
|
+
性能 JSON 保留 0.3.0 的历史基线;本补丁以正确性为主,不宣称新增速度收益。
|
|
216
|
+
|
|
217
|
+
## 12. 0.4.0 可选并行实验
|
|
218
|
+
|
|
219
|
+
通过 `from rustgzip.experimental import compress_parallel, prefetch` 显式启用。
|
|
220
|
+
并行压缩保留 32 KiB 历史字典并合并 CRC,输出仍是单个标准 gzip member;
|
|
221
|
+
预取只把一个解码线程与调用方处理重叠,不是一个 gzip 流的多核解码。
|
|
222
|
+
原有 `open / compress / verify` 默认不变。
|
|
223
|
+
|
|
224
|
+
实验结果、使用示例、内存限制和失败处理见 [PARALLEL-040.md](PARALLEL-040.md)。
|
|
225
|
+
Linux Python 3.4 / 3.7 各 100 项运行测试通过;新增 4 项 Rust 并发正确性测试。
|
|
226
|
+
并行压缩只支持至多 512 MiB 的内存输入,大文件仍使用现有文件流接口。
|
|
227
|
+
|
|
228
|
+
## 13. 0.5.0 并行路径继续优化
|
|
229
|
+
|
|
230
|
+
并行压缩改用调用内固定工作线程,按块完成情况继续领取任务;调用线程参与计算。
|
|
231
|
+
新增 `rustgzip.experimental.compress_parallel_into`,可以直接写入已有缓冲,减少完整结果
|
|
232
|
+
分配与复制。原有默认接口不变。性能收益、退化配置和示例见
|
|
233
|
+
[OPTIMIZATION-050.md](OPTIMIZATION-050.md)。当前运行测试为 106 项,Rust 并发测试为 5 项。
|
|
234
|
+
|
|
235
|
+
## 14. 0.5.2 审查修复
|
|
236
|
+
|
|
237
|
+
修复关闭中断时的原生句柄泄漏、预取意外 StopIteration 被当成 EOF、预取关闭中断
|
|
238
|
+
未完成清理,以及超限可变输入先复制再拒绝。高压缩率块及时收缩冗余容量,并加强
|
|
239
|
+
发布包身份和路径检查。复现、内存对照和限制见 [REVIEW-051.md](REVIEW-051.md)。
|
|
240
|
+
当前运行测试 115 项(主接口 85、实验接口 30),发布工具测试 10 项。
|
|
241
|
+
|
|
242
|
+
## 15. 开发中的普通 gzip 文件并行验证
|
|
243
|
+
|
|
244
|
+
当前整体架构、未解决瓶颈和下一步实施方向,优先阅读
|
|
245
|
+
[架构瓶颈审计](ARCHITECTURE-BOTTLENECK-AUDIT.md)。它用三路径反事实和已知检查点
|
|
246
|
+
对照区分了符号成本、真实历史串行链与后端潜力;下面的局部实验成绩不能相加,
|
|
247
|
+
也不能当作已经完成普通 gzip 多核扩展。
|
|
248
|
+
|
|
249
|
+
审计后的第一步已实现独立符号内核:以任务输出为 LZ77 历史,结束时才构造尾窗,
|
|
250
|
+
并比较安全宽位读取。64 MiB 固定 CPU 对照中,未知历史日志从现有文件符号路径
|
|
251
|
+
约 177 提高到 329 MiB/s;这仅是第一阶段内核成绩,尚未接入工作池或 Python。
|
|
252
|
+
六项新增正确性测试、全部结果和接入条件见
|
|
253
|
+
[符号内核原型报告](SYMBOL-KERNEL-PROTOTYPE-REPORT.md)。
|
|
254
|
+
|
|
255
|
+
源码内部已加入自主符号解码、候选扫描、有界文件工作池和按真实历史提交 CRC 的
|
|
256
|
+
验证原型,没有预建索引;巨大候选超出预算时可从可信位置跨窗口继续处理。
|
|
257
|
+
本机 Rust 默认 debug 构建回归为 176 项通过、3 项测量测试默认跳过。
|
|
258
|
+
|
|
259
|
+
另有显式 `known-window-backend` 构建:可信真实历史下的直接文件解码已接入
|
|
260
|
+
zlib-rs 底层后端。未知窗口 worker 已支持有界连续多块任务,在完整块边界且
|
|
261
|
+
尾窗口没有 Marker 时自动交接;当前该构建 debug 回归 186 项通过,全部实验开关
|
|
262
|
+
debug/release 各 206 项通过;各有 3 项测量测试默认跳过。
|
|
263
|
+
原生处理量区分候选工作和可信采用量。功能默认不启用,适配限制、32 KiB 误区见
|
|
264
|
+
[P6 底层适配续篇](PARALLEL-DECODE-P6-LOWLEVEL-REPORT.md),最新实现及本机开关
|
|
265
|
+
对照测速见 [worker 交接报告](PARALLEL-DECODE-WORKER-HANDOFF-REPORT.md)。
|
|
266
|
+
|
|
267
|
+
现已补充共享顺序提交层,Rust 内部支持文件到自有内存及预分配缓冲的真实输出,
|
|
268
|
+
并有默认关闭的分段计时;依据诊断加入原生状态复用及减少提交复制。
|
|
269
|
+
最新测量、输出失败契约与接口路线见
|
|
270
|
+
[输出与诊断报告](PARALLEL-DECODE-OUTPUT-AND-PROFILE-REPORT.md)。
|
|
271
|
+
这些不是已发布的 Python decompress_parallel 或 open_parallel。
|
|
272
|
+
|
|
273
|
+
后续已实现真实历史前缀、按压缩区间对齐的实验调度、u8 原生后缀及批量
|
|
274
|
+
match/stored 路径,并记录任务采用率、重解下界和丢弃分类。
|
|
275
|
+
32/64 MiB、1/2/4 worker 的实现和测量限制见
|
|
276
|
+
[对齐调度优化报告](PARALLEL-DECODE-ALIGNED-REPORT.md)。
|
|
277
|
+
进一步完成任务级尾窗恢复、原生缓冲复用、发布前一致性检查和 stored 长度前视;
|
|
278
|
+
最终较大样本的提速与剩余限制见
|
|
279
|
+
[固定成本优化报告](PARALLEL-DECODE-COST-OPTIMIZATION.md)。
|
|
280
|
+
|
|
281
|
+
最新一轮分离物理读缓存与解析事务、借用原生后缀、汇总历史依赖、复用符号读取状态,
|
|
282
|
+
并提供显式 stored 专用路径。64 MiB 同轮对照中随机和日志改善,stored 接近顺序基线,
|
|
283
|
+
但无任务的重复数据路径仍有退化;完整结果与尚未解决的问题见
|
|
284
|
+
[解码调优报告](PARALLEL-DECODE-TUNING-REPORT.md)。
|
|
285
|
+
|
|
286
|
+
另有显式 `intrablock-handoff` 试验:重放原始块头恢复 Huffman 表,仅在完整 token
|
|
287
|
+
结束且窗口完全已知时切换,因此可在某些大压缩块的 EOB 之前进入原生后端。
|
|
288
|
+
它尚未作为默认路径:大块隔离测试明显获益,但完整调度样本未显示普遍收益。
|
|
289
|
+
默认 8 位 Huffman 表保留,长码不再重复解析已经查过的前缀;9/10 位表和回退统计
|
|
290
|
+
仅作为显式诊断选项。实现条件、对照测量及限制见
|
|
291
|
+
[结构优化报告](PARALLEL-DECODE-STRUCTURAL-REPORT.md)。
|
|
292
|
+
|
|
293
|
+
进一步定位并修复无任务路径的批次分配、直接块状态重建和重复文件状态检查,
|
|
294
|
+
已证明没有可用网格的 Aligned 文件不再创建空闲线程。重复数据的旧退化明显收敛,
|
|
295
|
+
但日志的符号处理与顺序提交仍使并行路径慢于顺序基线;控制实验、正确性边界及
|
|
296
|
+
真实历史反馈的后续方案见 [退化定位报告](PARALLEL-DECODE-REGRESSION-REPORT.md)。
|
|
297
|
+
|
|
298
|
+
现已加入默认关闭的 `history-feedback` 实验:向运行中的推测任务提供精确原始
|
|
299
|
+
位起点的真实历史,解析当前窗口后尝试块内原生交接,不等待字典,旧 Marker
|
|
300
|
+
前缀及最终 CRC 仍完整校验。64 MiB 日志单 worker 能命中反馈,四 worker
|
|
301
|
+
尚未命中,整体仍慢于顺序基线;不能把该机制已实现等同于日志提速已完成。
|
|
302
|
+
安全边界、命中统计和开关对照见
|
|
303
|
+
[历史反馈实验报告](PARALLEL-DECODE-HISTORY-FEEDBACK-REPORT.md)。
|
|
304
|
+
|
|
305
|
+
后续显式 `unknown-prefix-yield` 实验在未知引用长期存在、符号前缀达到 256 KiB
|
|
306
|
+
后的完整块边界提前交付,由真实历史任务接续,不让 worker 原地等待字典。
|
|
307
|
+
64 MiB 日志四 worker 同轮由约 465 提升至 624 MiB/s,但仍低于顺序约 922 MiB/s,
|
|
308
|
+
2→4 worker 扩展也仍有限。它不是巨大 Huffman 块中途暂停功能,仍默认关闭;
|
|
309
|
+
正确性、失败回收和采用量见 [前缀交付实验报告](PARALLEL-DECODE-PREFIX-YIELD-REPORT.md)。
|
|
310
|
+
|
|
311
|
+
另有显式 `direct-native-output` 实验,使用已初始化 Vec 尾部直接接收 worker 原生
|
|
312
|
+
输出,减少 scratch→结果的复制。64/128 MiB 对照没有显示稳定的四线程收益,
|
|
313
|
+
因此仍默认关闭,不替换既有路径;初始化、失败回滚和复测结果见
|
|
314
|
+
[原生直接输出实验报告](PARALLEL-DECODE-DIRECT-OUTPUT-REPORT.md)。
|
|
315
|
+
|
|
316
|
+
时间线进一步确认日志已知历史任务基本串行:原生处理占比高不等于任务可并发。
|
|
317
|
+
显式 `coordinator-native` 在当前 member 实际采用 Marker 前缀后,让可信后继
|
|
318
|
+
直接由协调器连续推进,保留前方并行推测,并按需读取 stored 等价头信息。
|
|
319
|
+
128 MiB 同源码七轮对照中日志四 worker 约 624→667 MiB/s,单 worker 约
|
|
320
|
+
510→703 MiB/s;仍低于顺序基线,不能称四核扩展完成。确切主因、失败方案、
|
|
321
|
+
策略重置和最终对照见 [关键路径定位报告](PARALLEL-DECODE-CRITICAL-PATH-REPORT.md)。
|
|
322
|
+
|
|
323
|
+
块内交接现另有显式 `distance-bounded-handoff`:移除窗口已经真实时的块内 32 KiB
|
|
324
|
+
输出门槛;仅对终块,还可根据距离树上界使用已知短尾字典,保留更早 Marker。
|
|
325
|
+
单未知大动态块同轮约 1799→2174 MiB/s,符号前缀 32768→2 字节。普通日志仍
|
|
326
|
+
没有块内重放机会,不能套用该提升;终块限制、配额和完整管线实验证据见
|
|
327
|
+
[距离约束交接报告](PARALLEL-DECODE-DISTANCE-HANDOFF-REPORT.md)。
|
|
328
|
+
|
|
329
|
+
新增显式 `spare-native-output` 实验:worker 原生输出直接写 Vec 备用容量,
|
|
330
|
+
省掉尾部预清零,只发布实际写入的字节;失败回滚和终止规则继续生效。
|
|
331
|
+
普通数据有收益,隔离高压缩率样本也出现退化,按膨胀率自动回退的方案已因
|
|
332
|
+
误判撤回,因此继续默认关闭。最终三路测速、安全边界及测试见
|
|
333
|
+
[备用容量输出报告](PARALLEL-DECODE-SPARE-OUTPUT-REPORT.md)。
|
|
334
|
+
|
|
335
|
+
另有默认关闭的 `reuse-native-history`,在协调器导出块尾字典时复用已消费的
|
|
336
|
+
历史 Vec,避免逐块重新分配和清零。专项测试确认短/空窗口不会带出旧字节,
|
|
337
|
+
但两轮 128 MiB 对照未显示稳定吞吐收益,不能当成已完成的提速。
|
|
338
|
+
实现、安全边界和全部结果见 [历史缓冲复用报告](PARALLEL-DECODE-HISTORY-REUSE-REPORT.md)。
|
|
339
|
+
|
|
340
|
+
继续加入默认关闭的 `lazy-native-history` 与 `quiet-idle-workers`:真实历史只在
|
|
341
|
+
候选验证/反馈等确实需要时导出;队列为空时不广播任务通知,完成/取消等通知保留。
|
|
342
|
+
128 MiB 日志窗口导出由 1417 次降到 14 次;在按需历史开启后再省空队列通知,
|
|
343
|
+
四 worker 两轮约改善 1.9%、8.3%,但单 worker 部分配置仍有退化,仍慢于顺序。
|
|
344
|
+
实现、专项测试、通知计数和完整开关对照见
|
|
345
|
+
[按需历史与通知报告](PARALLEL-DECODE-LAZY-HISTORY-REPORT.md)。
|
|
346
|
+
|
|
347
|
+
**尚未提供 Python 调用入口,也没有 UOS 实机结论。** 本机已有端到端开关对照;
|
|
348
|
+
随机 Base64 样本经调参已实测超过同轮顺序基线;这不代表 stored、日志或所有
|
|
349
|
+
gzip 都能超过顺序路径,也不代表已经完成 UOS 上的多核验收。
|
|
350
|
+
当前发布包及上文的公共 API 仍保持 0.5.2 行为。实现范围、预算、测试和待完成事项见
|
|
351
|
+
[文件工作池报告](PARALLEL-DECODE-FILE-POOL-REPORT.md)。
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
rustgzip-0.5.2.dist-info/METADATA,sha256=RjC7NgQi8JY4yNySAG1zof0d-DbKQjr4TUx11jcfZpo,20772
|
|
2
|
+
rustgzip-0.5.2.dist-info/WHEEL,sha256=TBiJrygVATd6JoVQRXwDbSyc6GbLYQ_siCwsx2ASbmQ,86
|
|
3
|
+
rustgzip-0.5.2.dist-info/licenses/LICENSE,sha256=GEI08rWtQb9FR2gz4kREIlBv74J9q5SxOsPUBZ8WIKY,1082
|
|
4
|
+
rustgzip-0.5.2.dist-info/licenses/OPTIMIZATION-030.md,sha256=aipqPzmY3p46E-w6s8KtBbepJckJQeeBQR30r30MDxw,5452
|
|
5
|
+
rustgzip-0.5.2.dist-info/licenses/OPTIMIZATION-050.md,sha256=iP8-eIqWJlEQe8SdBdDRUA8US9r2VXPyB6nXTo2yEDA,6625
|
|
6
|
+
rustgzip-0.5.2.dist-info/licenses/PARALLEL-040.md,sha256=KaNksuf3BEo9DDtcVhzGJ_yDZKGsXm7YOhpuw4q9tjQ,8458
|
|
7
|
+
rustgzip-0.5.2.dist-info/licenses/PROVENANCE.md,sha256=mNeqNpVYwSpjIIu6UEMPyS8ioy2MHGAZ0zDD8lVPceY,3163
|
|
8
|
+
rustgzip-0.5.2.dist-info/licenses/README.md,sha256=Y46ox1Muvt3DcHln1EYPBw7o9w2smNHoFaki8G-mcA0,20600
|
|
9
|
+
rustgzip-0.5.2.dist-info/licenses/REVIEW-031.md,sha256=xZVe5N8MZ23tL2pkq3SHKSI4ugapC60lmStilOAKlfo,3667
|
|
10
|
+
rustgzip-0.5.2.dist-info/licenses/REVIEW-051.md,sha256=lHx3r9OKMnTVKH88jaH6H06_pFA0cD1dB6bJlqonfHk,5338
|
|
11
|
+
rustgzip-0.5.2.dist-info/licenses/UPSTREAM-REVIEW.md,sha256=LcW0BvoCgayrWDz3tqU8w7hu9YfwyN4ZZGziqCexDdc,7330
|
|
12
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/cfg-if-LICENSE-APACHE,sha256=pg7qgXUUUxZo1-AHZXMUSf4U0FnTJJ4LyTs23kX3WfI,10847
|
|
13
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/cfg-if-LICENSE-MIT,sha256=N49YQLJY4necOUGPPy17K6lvHHkX3WvgcT-IMF29o5c,1057
|
|
14
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/crc32fast-LICENSE-APACHE,sha256=xllut76FgcGL5zbIRvuRc7aezPbvlMUTWJPsVr2Sugg,11358
|
|
15
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/crc32fast-LICENSE-MIT,sha256=YdODsFuH14-U0pN-JYDM5HIm0XgjwEMPvK0JWWU3788,1097
|
|
16
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/flate2-LICENSE-APACHE,sha256=pg7qgXUUUxZo1-AHZXMUSf4U0FnTJJ4LyTs23kX3WfI,10847
|
|
17
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/flate2-LICENSE-MIT,sha256=AlQ27f9M_N3helgR_ep4iS2Egu_Rq97FoXhy0HpPIRI,1062
|
|
18
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/COPYRIGHT-library.html,sha256=Vke-B0yO33M5_YYwVZI6j8gLxWEKjUZh7Dt2e505LCc,1499465
|
|
19
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/Apache-2.0.txt,sha256=B05uMshqTA74s-0ltyHKI6yoPfJ3zYgQbvcXfDVGFf8,10280
|
|
20
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/BSD-2-Clause.txt,sha256=8y-ztBehlBZ8-tBoIj_JdbqWxZYFE6EPZqPChyCuwd8,1267
|
|
21
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/CC-BY-SA-4.0.txt,sha256=I-54yLrknPCOovDISUXGa5h-vkUgiB-1Gz2tT7Q9B8I,20137
|
|
22
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/GCC-exception-3.1.txt,sha256=o5ZslBDvlKHvv6nsBOnBmUAmpwYj-_CIXONnN7-6O1Q,3320
|
|
23
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/GPL-2.0-only.txt,sha256=VLISuh-X9pSPpUhiOatQXdggsC5Qy_0pa0BiyGCacK8,17642
|
|
24
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/GPL-3.0-or-later.txt,sha256=BTFfzmw195uKNUVIKJlfomM28jWJWsZFV6vAKPT_zqI,34795
|
|
25
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/ISC.txt,sha256=D_YXabI4Y04EKrdZ3d_RBKjmnQkeNgCuNBDkAaYWQ4E,730
|
|
26
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/LLVM-exception.txt,sha256=40xYM4vYnUPnCeImYQ2PMrPjxH9K2amajcHUrHhCSI4,919
|
|
27
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/MIT.txt,sha256=uF3NPkU9BZglUsUrX8ngvdbSPG-OhEuYSoivMlcLDMA,1078
|
|
28
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/NCSA.txt,sha256=OcsCNAZckrnmzuODDLtSsaoomqj-m6LmZzD-xc8FxjA,1676
|
|
29
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/OFL-1.1.txt,sha256=juqCh-WHa1OWcMrbgumfmnr93sb2cwgRvh2vJdLpvP0,4016
|
|
30
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-linux/licenses/Unicode-3.0.txt,sha256=9QYsmhiNgd_ma1bbQYLc-eSxfA2bDTEajiCzobB1xEM,1995
|
|
31
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-COPYRIGHT-library.html,sha256=Vke-B0yO33M5_YYwVZI6j8gLxWEKjUZh7Dt2e505LCc,1499465
|
|
32
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/Apache-2.0.txt,sha256=B05uMshqTA74s-0ltyHKI6yoPfJ3zYgQbvcXfDVGFf8,10280
|
|
33
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/BSD-2-Clause.txt,sha256=8y-ztBehlBZ8-tBoIj_JdbqWxZYFE6EPZqPChyCuwd8,1267
|
|
34
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/CC-BY-SA-4.0.txt,sha256=I-54yLrknPCOovDISUXGa5h-vkUgiB-1Gz2tT7Q9B8I,20137
|
|
35
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/GCC-exception-3.1.txt,sha256=o5ZslBDvlKHvv6nsBOnBmUAmpwYj-_CIXONnN7-6O1Q,3320
|
|
36
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/GPL-2.0-only.txt,sha256=VLISuh-X9pSPpUhiOatQXdggsC5Qy_0pa0BiyGCacK8,17642
|
|
37
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/GPL-3.0-or-later.txt,sha256=BTFfzmw195uKNUVIKJlfomM28jWJWsZFV6vAKPT_zqI,34795
|
|
38
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/ISC.txt,sha256=D_YXabI4Y04EKrdZ3d_RBKjmnQkeNgCuNBDkAaYWQ4E,730
|
|
39
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/LLVM-exception.txt,sha256=40xYM4vYnUPnCeImYQ2PMrPjxH9K2amajcHUrHhCSI4,919
|
|
40
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/MIT.txt,sha256=uF3NPkU9BZglUsUrX8ngvdbSPG-OhEuYSoivMlcLDMA,1078
|
|
41
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/NCSA.txt,sha256=OcsCNAZckrnmzuODDLtSsaoomqj-m6LmZzD-xc8FxjA,1676
|
|
42
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/OFL-1.1.txt,sha256=juqCh-WHa1OWcMrbgumfmnr93sb2cwgRvh2vJdLpvP0,4016
|
|
43
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/rust-windows-licenses/Unicode-3.0.txt,sha256=9QYsmhiNgd_ma1bbQYLc-eSxfA2bDTEajiCzobB1xEM,1995
|
|
44
|
+
rustgzip-0.5.2.dist-info/licenses/third-party/zlib-rs-LICENSE,sha256=5yERxSt9luviU0je4Z8HRPRE08la5rHstsyuzFvOBbo,856
|
|
45
|
+
rustgzip/__init__.py,sha256=l27Eigysid5BL5LQ59ef1Sb9zsMb5NeImFdvkkx8xRk,17137
|
|
46
|
+
rustgzip/experimental.py,sha256=hSoRiiVIju_9Pihk5tiz-iftFeehqkwi5mK26WowXp4,12728
|
|
47
|
+
rustgzip/rustgzip_native.dll,sha256=oRYQmasY3v3aL5eVvyl0Y70CnPKHBzBgupnc1ymRfzM,370688
|
|
48
|
+
rustgzip-0.5.2.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 rustgzip-uos contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# 0.3.0:继续搜索后的优化与验证
|
|
2
|
+
|
|
3
|
+
本轮目标是减少已有解码路径的额外工作,兼容 Python 3.4,继续完整验证 gzip。
|
|
4
|
+
新增封装独立编写,没有复制非公开代码,没有引入新的压缩算法或更改 gzip 格式。
|
|
5
|
+
|
|
6
|
+
## 1. 搜索结果与采用理由
|
|
7
|
+
|
|
8
|
+
- [flate2 Decompress API](https://docs.rs/flate2/1.1.10/flate2/struct.Decompress.html) 提供
|
|
9
|
+
gzip、未初始化输出及 Vec 剩余容量接口,可避免“临时缓冲 → 完整 Vec”的复制。
|
|
10
|
+
但查看锁定的 flate2 1.1.10 源码发现:其 zlib-rs 后端没有覆盖默认的
|
|
11
|
+
`decompress_uninit`,默认实现会先初始化整个输出区域。仅调用这个名字并不能获得预期收益。
|
|
12
|
+
- [zlib-rs](https://github.com/trifectatechfoundation/zlib-rs) 的公开 `Inflate::decompress_uninit`
|
|
13
|
+
真正支持未初始化目标。本包此前已经通过 flate2 使用 zlib-rs 0.6.8;现在将同一版本
|
|
14
|
+
增加为直接依赖,用于内存快路径,没有增加新的第三方代码或许可证种类。
|
|
15
|
+
- 同时核对 flate2 的 `crc.rs`,确认启用 zlib-rs 时本来就使用 zlib-rs 优化 CRC。
|
|
16
|
+
因此不能把“替换 CRC”当作已经实现的新加速。
|
|
17
|
+
- [libdeflate 官方说明](https://github.com/ebiggers/libdeflate#api) 明确主要支持整块缓冲,
|
|
18
|
+
不支持普通流式接口;不能直接替代我们的大文件 open/verify。保留为未来独立后端的候选。
|
|
19
|
+
- [zenflate 许可](https://github.com/imazen/zenflate#license) 是 AGPL/商业双许可。
|
|
20
|
+
本次没有集成它,不改变现有包的宽松许可依赖集合。
|
|
21
|
+
|
|
22
|
+
## 2. 已保留的改动
|
|
23
|
+
|
|
24
|
+
### 内存路径直接填充 Vec 剩余容量
|
|
25
|
+
|
|
26
|
+
新增 `src/memory.rs`。常见的无可选字段 gzip 头交给 zlib-rs gzip 模式,
|
|
27
|
+
CRC、ISIZE、DEFLATE 和结束状态仍由公开后端检查。用后端报告的已写入字节数扩展 Vec.len,
|
|
28
|
+
未写入的容量不返回 Python。所有指针/容量均继续配对释放。
|
|
29
|
+
|
|
30
|
+
遇到 FNAME、FCOMMENT、FEXTRA、FHCRC 或异常标志时,余下串接流转交原有 flate2 解析路径,
|
|
31
|
+
保留字段长度限制、保留位检查、头部 CRC 和错误行为。缓冲区尾部也不因回退而被清零。
|
|
32
|
+
|
|
33
|
+
当结果恰好填满 Vec 时,先用一个栈字节探测 EOF/CRC,不为了确认结束而先扩容整个结果。
|
|
34
|
+
确实还有数据才扩大容量,输出仍受 max_output_size 限制。gzip ISIZE 继续只作为有界提示。
|
|
35
|
+
|
|
36
|
+
### 串接文件复用解码状态
|
|
37
|
+
|
|
38
|
+
原来每结束一个 member 就销毁、重新创建 GzDecoder。现在通过输入槽位和公开 reset 接口
|
|
39
|
+
复用状态,保留未消费的压缩输入。CRC、位流、窗口有效长度和解析状态均重置。
|
|
40
|
+
适合由许多小 member 组成的 gzip。文件流不改为整文件加载。
|
|
41
|
+
|
|
42
|
+
## 3. 没有保留为默认行为的尝试
|
|
43
|
+
|
|
44
|
+
扫描了 verify 的 16/32/64/128/256/512/1024/2048 KiB 缓冲大小。
|
|
45
|
+
没有找到两个平台、不同数据都获益的默认值,因此继续保持 1 MiB。
|
|
46
|
+
较小缓冲在构建虚拟机上反而可能显著变慢。完整结果见 buffer-sweep-*.json。
|
|
47
|
+
|
|
48
|
+
没有默认开启预取线程、强制 AVX2/AVX512 或改变压缩级别;没有跳过 CRC。
|
|
49
|
+
普通单流 gzip 多核解压尚未实现,不能把 member 状态复用称为多核解码。
|
|
50
|
+
|
|
51
|
+
## 4. 与 0.2.0 的比较方式和限制
|
|
52
|
+
|
|
53
|
+
同平台使用相同输入,通过 SHA256 对齐;独立进程加载各自动态库,预热后测七轮取中位数。
|
|
54
|
+
最终新旧版本串行执行,不同时运行两套性能测试。操作系统文件缓存仍参与文件测试。
|
|
55
|
+
真实内网 UOS 没有实测,Linux 结果来自 Debian 10 / Python 3.4.10 构建虚拟机。
|
|
56
|
+
|
|
57
|
+
Linux 最后一次 16 MiB 普通输入比较中,structured:20.986 → 19.055 ms(1.10 倍);random:10.307 → 5.905 ms(1.75 倍)。
|
|
58
|
+
此前复测曾得到约 1.06/1.37 倍,结果受负载、缓存和分配器影响。
|
|
59
|
+
小输入和 decompress_into 不是所有项目都有收益,不宣称普遍加速。
|
|
60
|
+
|
|
61
|
+
串接 member 文件测试(总原始数据 16 MiB):
|
|
62
|
+
|
|
63
|
+
| member 大小 | 操作 | 0.2.0 | 0.3.0 | 比值 |
|
|
64
|
+
|---|---|---:|---:|---:|
|
|
65
|
+
| 4 KiB,4096 个 | verify | 106.219 ms | 77.710 ms | 1.37 倍 |
|
|
66
|
+
| 4 KiB,4096 个 | file_read | 125.424 ms | 111.137 ms | 1.13 倍 |
|
|
67
|
+
| 64 KiB,256 个 | verify | 11.422 ms | 10.197 ms | 1.12 倍 |
|
|
68
|
+
| 64 KiB,256 个 | file_read | 14.266 ms | 12.952 ms | 1.10 倍 |
|
|
69
|
+
|
|
70
|
+
初轮串接 verify 测试曾只有约 0~2% 变化,因此也不把最终 37% 样例推广为普遍收益。
|
|
71
|
+
单 member 的 open/verify 基本没有本质变化;压缩路径本轮未优化,不能将其计时变化算作收益。
|
|
72
|
+
Windows 多次测试出现明显的环境速度波动,连未改动的压缩/verify 也变化很大,
|
|
73
|
+
因此不把这一轮 Windows 数字作为可靠加速结论。原始样本仍保留供检查。
|
|
74
|
+
|
|
75
|
+
## 5. 正确性与交付
|
|
76
|
+
|
|
77
|
+
Linux Python 3.4.10/3.7 均通过 69 项测试;Windows 通过 68 项并跳过 1 项 Linux 专用测试。
|
|
78
|
+
测试包含 80 组随机输出/容量边界、空 member、千个串接 member、padding、头部 CRC、
|
|
79
|
+
最后 member 损坏、截断、跨 member 字典隔离、输出尾部保持及磁盘写满。
|
|
80
|
+
|
|
81
|
+
Rust clippy 严格警告检查通过。ABI 标记升级为 3,用于拒绝混装旧动态库和新版 Python。
|
|
82
|
+
Python API 用法保持兼容;升级时替换整个 wheel/包,运行时仍无第三方 Python 依赖。
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# 0.5.0:在并行实验上继续优化
|
|
2
|
+
|
|
3
|
+
这次保留两个方向:调用内固定工作线程与直接写入已有输出缓冲。
|
|
4
|
+
原有 `open / verify / compress / decompress` 默认行为不变;仍兼容 Python 3.4。
|
|
5
|
+
|
|
6
|
+
## 1. 固定工作线程,按完成情况领取下一块
|
|
7
|
+
|
|
8
|
+
0.4.0 每一波为若干块创建线程,等该波最慢的一块结束后,再启动下一波。
|
|
9
|
+
块的压缩难度不同时,部分 CPU 会提前空闲;小块很多时,还会重复创建线程。
|
|
10
|
+
|
|
11
|
+
0.5.0 在一次调用里保持固定并发度,工作完成后就领取下一块。调用线程也参与
|
|
12
|
+
压缩,因此最多创建 `workers - 1` 个后台线程。只有一个块或一个工作线程时,
|
|
13
|
+
直接执行,跳过线程、原子队列及结果槽位等调度分配。
|
|
14
|
+
|
|
15
|
+
结果按原文块编号汇总,不按完成先后顺序写入。发生错误时停止领取新工作,
|
|
16
|
+
等待已开始的工作结束并 join 所有线程,然后抛出异常、释放临时结果。
|
|
17
|
+
没有跨调用的常驻线程池,也不长期保存用户输入。
|
|
18
|
+
|
|
19
|
+
压缩算法、32 KiB 字典、SyncFlush/Finish、CRC 合并和单 member 格式保持不变。
|
|
20
|
+
所有对照配置均验证:新接口返回结果和 0.4.0 **逐字节一致**,并能被标准库还原。
|
|
21
|
+
|
|
22
|
+
## 2. 新增 compress_parallel_into
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
import io
|
|
26
|
+
from rustgzip.experimental import compress_parallel_into
|
|
27
|
+
|
|
28
|
+
data = b'example log line\n' * 100000
|
|
29
|
+
output = bytearray(4 * 1024 * 1024) # 由调用方预留,可供后续调用继续复用。
|
|
30
|
+
count = compress_parallel_into(data, output, workers=4,
|
|
31
|
+
chunk_size=1024 * 1024)
|
|
32
|
+
view = memoryview(output)[:count]
|
|
33
|
+
try:
|
|
34
|
+
with io.open('output.gz', 'wb') as handle:
|
|
35
|
+
handle.write(view)
|
|
36
|
+
finally:
|
|
37
|
+
view.release()
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
参数和返回值:
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
compress_parallel_into(data, output, compresslevel=6, workers=2,
|
|
44
|
+
chunk_size=1024 * 1024, use_dictionary=True)
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
- 返回有效字节数;仅 `output[:count]` 是本次 gzip,后面的容量不改写。
|
|
48
|
+
- output 必须可写、C 连续,支持 bytearray 和可写连续 memoryview。
|
|
49
|
+
- 仍限制输入最多 512 MiB、工作并发度 1..32、块长 32 KiB..16 MiB。
|
|
50
|
+
- 容量不足时抛出 OSError,错误包含本次实际需要的字节数;检查容量之前不会
|
|
51
|
+
写输出。可释放自己的视图、扩容后重试,但会重新执行压缩。
|
|
52
|
+
- 异常处理期间也会释放本接口持有的视图,避免用户保留 traceback 时无法扩容。
|
|
53
|
+
- 失败或 Ctrl+C 后不使用缓冲里的内容。调用期间其他线程不得访问或扩容 output。
|
|
54
|
+
- 如果输入和输出是同一个 bytearray,输入先按现有规则复制为不可变 bytes,避免重叠。
|
|
55
|
+
|
|
56
|
+
这条路径不创建完整 Rust 汇总 Vec,也不执行 `ctypes.string_at` 的完整 Python bytes
|
|
57
|
+
复制。压缩块写入目标仍要复制,所以不是完全零复制。若随后又调用
|
|
58
|
+
`bytes(output[:count])`,会重新引入复制成本,速度收益可能消失。
|
|
59
|
+
原文与各块压缩结果仍保留在内存,这仍然不是大文件流式压缩器。
|
|
60
|
+
|
|
61
|
+
## 3. 同条件实测
|
|
62
|
+
|
|
63
|
+
基线为已交付的 **0.4.0 并行接口**,不是标准库或单线程压缩。
|
|
64
|
+
两个版本分别在独立进程加载,避免同名原生库被缓存。每类输入只生成一次,
|
|
65
|
+
基线、新 bytes 接口、新 into 接口交替运行,各三次取中位数;不并发运行基准。
|
|
66
|
+
每次计时之后都检查标准库解码、压缩长度和结果 SHA256。
|
|
67
|
+
|
|
68
|
+
每个平台有 12 组配置:16 MiB 日志、16 MiB 随机数据、16 MiB 难度不均的混合块,
|
|
69
|
+
以及 128 KiB 小文件;分别测试 256 KiB、1 MiB、4 MiB 块长,均使用 4 个工作线程。
|
|
70
|
+
表中大于 1 表示更快,小于 1 表示更慢。
|
|
71
|
+
|
|
72
|
+
| 场景 | Linux 3.4 新调度 / 0.4.0 | Windows 新调度 / 0.4.0 |
|
|
73
|
+
|---|---:|---:|
|
|
74
|
+
| 日志,256 KiB 块 | 1.18 | 1.24 |
|
|
75
|
+
| 混合难度,1 MiB 块 | 1.30 | 1.25 |
|
|
76
|
+
| 随机数据,1 MiB 块 | 1.00 | 0.89 |
|
|
77
|
+
| 随机数据,4 MiB 块 | 1.03 | 1.02 |
|
|
78
|
+
|
|
79
|
+
预分配缓冲的 into 接口,相对同版 bytes 接口:随机数据在 Linux 约 1.07~1.09 倍,
|
|
80
|
+
Windows 约 1.15~1.17 倍。该计时**不包含一次性目标缓冲分配**和仅为测试校验而做的
|
|
81
|
+
结果复制,适合复用缓冲的业务;不代表首次分配再转回 bytes 也有同等收益。
|
|
82
|
+
|
|
83
|
+
完整结果保留退化与波动:[Linux](parallel-050-linux-py34.json)、[Windows](parallel-050-windows.json)。
|
|
84
|
+
小文件耗时很短、启动及调度波动占比高,不据其单次比值声称稳定提升。
|
|
85
|
+
部分大块原本就只有一波任务,新调度的收益也有限。动态调度在 Windows 某些随机数据
|
|
86
|
+
配置确有退化,因此不能宣称所有输入都更快;现有默认主 API 不改用这条实验路径。
|
|
87
|
+
|
|
88
|
+
Linux 使用 Debian 10 / glibc 2.28 虚拟机、真实 Python 3.4.10;Windows 为本机
|
|
89
|
+
Python 3.14。两者共用宿主硬件,所以顺序执行测试;这不是目标 UOS 实机数据。
|
|
90
|
+
|
|
91
|
+
## 4. 未保留的实验
|
|
92
|
+
|
|
93
|
+
尝试复用工作线程的 Compress 并在块间 reset,但对当前后端的 SyncFlush 分块,
|
|
94
|
+
某些相同参数输出受该线程之前处理的块影响。虽然当时解压校验通过,这不符合本项目
|
|
95
|
+
的确定性要求,因此撤回该优化,继续每块独立创建编码器。
|
|
96
|
+
新增交错随机/重复块的多线程数回归,避免仅凭重复日志测试就认定复用安全。
|
|
97
|
+
这不等于已经确认上游有数据泄漏或解压错误,本次没有修改 vendor 源码。
|
|
98
|
+
|
|
99
|
+
预取仍为可选且默认不变;没有给 verify 添加无效的预取队列,也没有把普通 gzip
|
|
100
|
+
解压标为多核。相关试验限制继续见 [PARALLEL-040.md](PARALLEL-040.md)。
|
|
101
|
+
|
|
102
|
+
## 5. 正确性与安装
|
|
103
|
+
|
|
104
|
+
Python 3.4 / 3.7 各 106 项运行测试;Windows 通过 104 项,跳过 2 项 Linux 专用测试。
|
|
105
|
+
Rust 5 项测试包含块边界、CRC 交叉还原、结果顺序、错误/panic 后 join 及线程初始化
|
|
106
|
+
数量限制。发布工具另有 7 项测试。新增 into 容量不足、尾部不改写、输出切片、
|
|
107
|
+
输入输出同缓冲及异常帧存在时扩容等检查。
|
|
108
|
+
|
|
109
|
+
原生 ABI 仍为 4,新增 `rg_compress_parallel_into` 是可选扩展。旧库缺少该函数时
|
|
110
|
+
会给出安装完整新包的提示。安装 0.5.0 后重启使用它的 Python 进程。
|
|
111
|
+
运行时不新增 Python 依赖、不联网,依赖和许可证选择保持不变。
|
|
112
|
+
|
|
113
|
+
复测时分别提供旧版安装目录和候选目录:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
PYTHONPATH=python python3 tests/test_experimental.py
|
|
117
|
+
cargo test --release --locked --offline
|
|
118
|
+
python3 tools/compare_parallel_releases.py /path/to/040 /path/to/050 result.json 16
|
|
119
|
+
```
|