From 9263d79d423b464664875e6342f21a6234d2b97d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 22 Sep 2026 13:36:25 +0800 Subject: [PATCH] =?UTF-8?q?3D=20=E4=BA=A7=E7=89=A9=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E6=8C=89=E5=A3=B0=E6=98=8E=E9=95=BF=E5=BA=A6=E9=A2=84=E5=88=86?= =?UTF-8?q?=E9=85=8D=E7=BC=93=E5=86=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - server-rs/crates/api-server/src/tripo3d/artifacts.rs:read_artifact 用 Vec::with_capacity 按 provider 声明的 content_length 预分配(并封顶到 512 MiB 上限,防止谎报长度撑爆内存),避免几百 MB 产物逐块 extend 反复搬移 验证:cargo check -p api-server(--locked) --- server-rs/crates/api-server/src/tripo3d/artifacts.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server-rs/crates/api-server/src/tripo3d/artifacts.rs b/server-rs/crates/api-server/src/tripo3d/artifacts.rs index db37e9e0e..c65ccb99a 100644 --- a/server-rs/crates/api-server/src/tripo3d/artifacts.rs +++ b/server-rs/crates/api-server/src/tripo3d/artifacts.rs @@ -25,7 +25,13 @@ pub(crate) async fn read_artifact( mut artifact: TripoDownloadedArtifact, ) -> Result { let content_type = artifact.content_type.clone().unwrap_or_default(); - let mut bytes = Vec::new(); + // 按声明长度预分配(封顶到单产物上限,防止 provider 谎报长度撑爆内存): + // 几百 MB 的模型逐块 append 会反复搬移,预分配把峰值与拷贝都压下来。 + let claimed_bytes = artifact + .content_length + .unwrap_or(0) + .min(MODEL3D_MAX_ARTIFACT_BYTES) as usize; + let mut bytes = Vec::with_capacity(claimed_bytes); while let Some(chunk) = artifact.next_chunk().await.map_err(map_provider_error)? { let next_len = bytes.len() as u64 + chunk.len() as u64; if next_len > MODEL3D_MAX_ARTIFACT_BYTES {