我有一个关于特定情况下的内存分配策略的问题。
我有大量的结构体通过 serde 来自 JSON API。JSON 响应中有一个特定字段,在少数情况下,该字段将存在并包含恰好包含 11 个元素的数组。在大多数情况下,该字段在响应中根本不存在。所有响应都需要存储。
大多数回复的格式如下:
{
id: 1,
event: "None"
}
Run Code Online (Sandbox Code Playgroud)
少数回复将采用以下格式:
{
id: 2,
event: "something",
event_details : [11 json objects here]
}
Run Code Online (Sandbox Code Playgroud)
如果我将用于解析 JSON 的结构定义为:
#[derive(Deserialize, Debug)]
struct Event {
id: u32,
event: String,
// EventDetail is a struct with an u32 and string field
events: Option<[EventDetail; 11]>
}
Run Code Online (Sandbox Code Playgroud)
我可以看到使用deepsizeof crateVec<Event>
创建的文件占用了约 500MB 的内存。如果我将该events
字段更改为,events: Option<Box<[EventDetail; 11]>>
内存使用量会下降到约 150MB。
我的理解是,由于 Box 是在运行时而不是编译时分配的,因此当传入的 JSON 响应缺少该字段时events
,则不需要分配 11 项数组。我在这里说得对吗?这是 Box …