Rust 用于唯一字符串计数的并行集合

Rust 用于唯一字符串计数的并行集合,rust,Rust,我需要一些高度并行化的集合,比如java并发skiplist。一般任务:我在一台服务器上工作,计算服务器收到的所有消息中的唯一单词。我不在乎这些词是什么,只在乎数量。偶尔,我会收到一条get_count信息,我会重置计数器并重新开始 但我总是在post_words功能上遇到瓶颈。在java中,同样的东西在80年代运行5s。我试过横梁上的实验性skiplist装置。我得到了同样的结果。另一个问题是字符串分配。有什么想法吗 //Dashset来自https://docs.rs/dashmap/4.

我需要一些高度并行化的集合,比如java并发skiplist。一般任务:我在一台服务器上工作,计算服务器收到的所有消息中的唯一单词。我不在乎这些词是什么,只在乎数量。偶尔,我会收到一条get_count信息,我会重置计数器并重新开始

但我总是在post_words功能上遇到瓶颈。在java中,同样的东西在80年代运行5s。我试过横梁上的实验性skiplist装置。我得到了同样的结果。另一个问题是字符串分配。有什么想法吗


//Dashset来自https://docs.rs/dashmap/4.0.2/dashmap/struct.DashSet.html
键入Words=DashSet;
let set:Arc=Arc::new(DashSet::具有_容量(100000));
//对于我创建的每个新套接字
设set=set.clone();
//文字处理
fn post_words(客户端:i32,数据:Vec,db:&words)->响应{
让mut decoder=GzDecoder::new(data.as_slice());
让mut input=String::new();
解码器。读取字符串(&mut输入)。展开();
//瓶颈
用于输入中的单词。拆分_空格(){
插入(字符串::from(单词));
}
让mut response=response::new();
response.status=响应\状态::OK;
返回响应
}

因为我不需要知道单词a,所以只能保留一个散列。现在我不必为每个单词分配字符串。这将我的解决方案从80年代改进到了1.7年代

type Words=DashSet;
异步fn post_字(客户端:i32,数据:Vec,db:&words)->响应{
让mut decoder=GzDecoder::new(data.as_slice());
让mut input=String::new();
解码器。读取字符串(&mut输入)。展开();
用于输入中的单词。拆分_空格(){
让mut s=DefaultHasher::new();
word.hash(&mut);
db.插入(s.finish());
}
让mut response=response::new();
response.status=响应\状态::OK;
返回响应
}

拆分单词之前是否需要对整个数据进行解码?工作人员做了两次我提出了一些必须回答的问题:您是用
--release
编译的,对吗Strings是UTF-8(但不确定这是否与Java不同),这可能会产生比我最初想象的更多的开销。您真的需要将
数据
转换为字符串,然后将
单词
转换为字符串吗?难道您不能只迭代
数据
(保留原始字节,即
u8
)并将
Vec
(而不是
字符串
)存储在
数据集
(从而避免潜在的UTF-8检查和断言)中吗?