最近边学习 rust 边实践了个数据存储服务器,会通过 grpc 并发接收大量数据,里面大量使用了 dashmap 来构建数据结构。例如:
state: DashMap<String, DashMap<i32, DashMap<i32, Arc<Mutex<StagingBuffer>>>>>
但是在测试 5tb 数据的时候,通过 cpu profile 发现火焰图中有热点是在获取嵌套 dashmap 的 entry 中,请教下 nested dashmap 该如何使用?
fn get_underlying_partition_buffer(
&self,
app_id: &String,
shuffle_id: &i32,
partition_id: &i32,
) -> Arc<Mutex<StagingBuffer>> {
let app_entry = self.state.get(app_id).unwrap();
let shuffle_entry = app_entry.get(shuffle_id).unwrap();
let partition_entry = shuffle_entry.get(partition_id).unwrap();
let buffer_cloned = partition_entry.value().clone();
buffer_cloned
}
如上的使用方式是对的么?
第一次提问,如有不周祥的地方请指出,感谢~
具体代码如下:https://github.com/zuston/riffle/blob/4ad7d501276022123aa69d48fbeb534737f8df05/src/store/memory.rs#L172-L185
1
共 4 条评论, 1 页
评论区
写评论感谢。昨天尝试了一维 dashmap ,性能好很多。我再试下你说的方式~
--
👇
aj3n: 你真的需要嵌套DashMap吗?
试试DashMap嵌套HashMap?
你真的需要嵌套DashMap吗?
试试DashMap嵌套HashMap?
有道理。不过 key 合成一个 tuple. 回头删的时候就有点麻烦
--
👇
dojiong: 嵌套多层会有多次同步,如果每次使用都是直接在最深层的map上操作可以考虑DashMap<(String, i32, i32), ...>
嵌套多层会有多次同步,如果每次使用都是直接在最深层的map上操作可以考虑DashMap<(String, i32, i32), ...>