陶泥儿产物读取按已知体积预分配

- read_package_bytes 接收调用方已验证的 expected_bytes,用 Vec::with_capacity
- 接近 200 MiB 的包不再因反复扩容多复制约一倍数据
This commit is contained in:
2026-10-07 10:58:46 +08:00
parent d3d7e5a8ca
commit 4acb0e7124
@@ -239,7 +239,7 @@ pub(crate) fn read_artifact_package(root: &Path) -> Result<TaonierArtifactPackag
}
ensure_within_platform_package_limit(metadata.len())?;
let (package_bytes, package_sha256) = read_package_bytes(&path)?;
let (package_bytes, package_sha256) = read_package_bytes(&path, metadata.len())?;
if package_bytes.len() as u64 != metadata.len() {
// 读取期间文件被替换:宁可让作者重新导出,也不上传一份哈希与内容对不上的包。
return Err("陶泥儿产物在读取期间发生变化,请重新导出".to_string());
@@ -255,11 +255,14 @@ pub(crate) fn read_artifact_package(root: &Path) -> Result<TaonierArtifactPackag
}
/// 一遍读完产物并同时算 sha256:不为了哈希再读一次盘。上限之外立即失败,避免把超大文件读进内存。
fn read_package_bytes(path: &Path) -> Result<(Vec<u8>, String), String> {
///
/// 调用方已经确认过 `expected_bytes` 在上限内,按它预分配容量即可,避免接近 200 MiB 的包在
/// 反复扩容时多复制约一倍数据。
fn read_package_bytes(path: &Path, expected_bytes: u64) -> Result<(Vec<u8>, String), String> {
let mut file = std::fs::File::open(path)
.map_err(|error| format!("打开陶泥儿产物失败:{}:{error}", path.display()))?;
let mut hasher = Sha256::new();
let mut bytes = Vec::new();
let mut bytes = Vec::with_capacity(expected_bytes as usize);
let mut buffer = vec![0u8; PACKAGE_READ_CHUNK_BYTES];
loop {
let read = file