对于我的项目,我需要非常有效地对大量字符串进行重复数据删除。也就是说,给定一个可能包含重复项的字符串列表,我想生成该列表中所有字符串的列表,但不包含任何重复项。
这是简化的伪代码:
set = # empty set
deduped = []
for string in strings:
if !set.contains(string):
set.add(string)
deduped.add(string)
这是简化的C ++(大致):
std::unordered_set <const char *>set;
for (auto &string : strings) {
// do some non-trivial work here that is difficult to parallelize
auto result = set.try_emplace(string);
}
// afterwards, iterate over set and dump strings into vector
但是,这还不足以满足我的需求(我已经对其进行了基准测试)。这里有一些使它更快的想法:
strcmp
)。我发现,所有这些解决方案都非常棘手,或者没有提供那么大的加速比。对快速重复数据删除有什么想法吗?理想情况下,不需要并行化或文件缓存的东西。
答案 0 :(得分:1)
您可以尝试各种算法和数据结构来解决您的问题:
不幸的是,没有通用的方法可以解决此问题。在很大程度上,决定取决于正在处理的数据的性质。在我看来,清单上的第二项是最有前途的。始终尝试减少计算量以使用较小的数据集。
答案 1 :(得分:0)
您可以通过手动实现std::unordered_set
的简化版本来显着并行化任务:
您可能需要尝试使用存储桶大小,并检查它会如何影响性能。从逻辑上讲,它的一侧不应太大,而另一侧也不能太小-以防止拥塞。
从您的描述开始,听起来您已将所有字符串加载到内存中,然后消除了重复项。您可以尝试直接将数据读取到std::unordered_set
,而不是那么节省内存并提高速度。