C++ Delta Selector 函数代码解析及优化
这段代码实现了一个名为 deltaSelector 的函数,它接受一个 std::list<DedupTask> 类型的列表作为参数,并根据设定的阈值来判断是否选择 Delta。
代码逻辑解析:
- 初始化无序映射: 函数首先使用一个
std::unordered_map类型的变量baseChunkPositions来记录每个基础块的位置。该映射的键是一个uint64_t类型的值,它包含了基础块所在的类别和在该类别中的偏移量。 - 遍历 DedupTask 列表: 函数遍历输入的
DedupTask列表,并对每个DedupTask条目进行如下判断:- 如果该条目的
lookupResult为LookupResult::Similar且inCache为 0,则说明该条目是一个相似且不在缓存中的基础块。 - 将该基础块的位置信息(类别和偏移量)转换为一个
uint64_t类型的键值。 - 使用
baseChunkPositions映射查找该键值是否存在。 - 如果不存在,则将该键值插入映射中,并将对应的计数设置为 1。
- 如果存在,则将对应的计数增加 1。
- 如果该条目的
- 应用阈值: 函数遍历
baseChunkPositions映射,并对每个条目的计数进行如下判断:- 如果计数小于全局变量
FLAGS_DeltaSelectorThreshold,则将该条目的计数设置为 0。该阈值代表了基础块被认为足够普遍的最小出现次数。
- 如果计数小于全局变量
- 设置 deltaReject 标志: 函数再次遍历
DedupTask列表,并对每个LookupResult::Similar且inCache为 0 的条目进行如下判断:- 使用
baseChunkPositions映射查找该条目的位置信息对应的计数。 - 如果计数为 0,则将该条目的
deltaReject标志设置为true,表示该条目不应该选择 Delta。
- 使用
优化建议:
- 可以使用
std::map代替std::unordered_map,以便对基础块位置进行排序,方便后续处理。 - 可以将
baseChunkPositions映射的键值类型改为自定义结构体,以便更清晰地表达基础块位置信息。 - 可以将阈值
FLAGS_DeltaSelectorThreshold作为函数参数传入,以便更灵活地控制阈值。
代码示例:
void deltaSelector(std::list<DedupTask> &dl) {
std::unordered_map<uint64_t, uint64_t> baseChunkPositions;
for (auto &entry: dl) {
if (entry.lookupResult == LookupResult::Similar && entry.inCache == 0) {
uint64_t key;
BaseChunkPositions *bcp = (BaseChunkPositions *) &key;
bcp->category = entry.basePos.CategoryOrder;
bcp->quantizedOffset = entry.basePos.cid;
auto iter = baseChunkPositions.find(key);
if (iter == baseChunkPositions.end()) {
baseChunkPositions.insert({key, 1});
} else {
baseChunkPositions[key]++;
}
}
}
// 这里的second就是指阈值,阈值不到的话,就直接baseChunkPositions[key] = 0 == entry.second = 0;
for (auto &entry: baseChunkPositions) {
if (entry.second < FLAGS_DeltaSelectorThreshold) {
entry.second = 0;
}
}
for (auto &entry: dl) {
if (entry.lookupResult == LookupResult::Similar && entry.inCache == 0) {
uint64_t key;
BaseChunkPositions *bcp = (BaseChunkPositions *) &key;
bcp->category = entry.basePos.CategoryOrder;
bcp->quantizedOffset = entry.basePos.cid;
if (baseChunkPositions[key] == 0) {
entry.deltaReject = true;
}
}
}
}
总结:
这段代码通过统计基础块位置的出现次数,并与阈值进行比较,来判断是否选择 Delta。该函数可以用于优化数据去重或数据压缩等场景。
原文地址: https://www.cveoy.top/t/topic/nGRY 著作权归作者所有。请勿转载和采集!