< 返回版块

zuston 发表于 2023-08-08 17:22

最近边学习 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

评论区

写评论
作者 zuston 2023-08-09 09:15

感谢。昨天尝试了一维 dashmap ,性能好很多。我再试下你说的方式~

--
👇
aj3n: 你真的需要嵌套DashMap吗?

试试DashMap嵌套HashMap?

aj3n 2023-08-09 02:00

你真的需要嵌套DashMap吗?

试试DashMap嵌套HashMap?

作者 zuston 2023-08-08 17:39

有道理。不过 key 合成一个 tuple. 回头删的时候就有点麻烦

--
👇
dojiong: 嵌套多层会有多次同步,如果每次使用都是直接在最深层的map上操作可以考虑DashMap<(String, i32, i32), ...>

dojiong 2023-08-08 17:37

嵌套多层会有多次同步,如果每次使用都是直接在最深层的map上操作可以考虑DashMap<(String, i32, i32), ...>

1 共 4 条评论, 1 页