小编sca*_*ala的帖子

使用 Box 优化可选的已知长度数组的内存分配

我有一个关于特定情况下的内存分配策略的问题。

我有大量的结构体通过 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 …

rust serde

15
推荐指数
1
解决办法
622
查看次数

标签 统计

rust ×1

serde ×1