我使用std::unordered_multimap mymap
作为我的数据结构,用于保存和快速访问类型为T
的超过10M元素(~10GB数据)作为自定义和不可避免的昂贵散列和相等(operator==
)函数的关键。
问题是它比我所熟悉的(大约45分钟左右)将所有数据集加载并存储到mymap中需要更长的时间,因为在数据存储后它不会改变我决定迭代桶并写将它们的元素分成单独的文件(序列化),以便下次我只创建足够的桶,保留内存,并直接将它们放在它们的位置(反序列化)并避免散列和相等性检查。
这将大大减少加载时间。 (低至约60秒)
遗憾的是,我找不到将元素直接插入std::unordered_multimap
的底层数据结构并绕过hashing / equalityChecking的方法。
更新:
std::unordered_map
不提供这样的功能,你会依赖脏兮兮的黑客。因此,您可以编写自己的哈希映射以允许此类操作 - 或者您可以按如下方式重新计算哈希计算所花费的时间:
class C
{
size_t m_hashCode;
bool m_isHashDirty;
public:
C() : m_isHashDirty(true);
size_t hashCode()
{
if(m_isHashDirty)
{
m_hashCode = /* result of complex calculations */;
}
return m_hashCode;
}
};
对象的任何修改都会设置脏标志,但您只能根据需要计算哈希值,并且如果之前的调用有更改。
您当然会在序列化时存储哈希码,并在反序列化时将其还原,将脏标志设置为false。
Equality运算符提供更少的优化选项,当然您可以在第一个检测到的不同成员上快捷键结果,但在最后一个成员检查之前,相等性不会确定。所以你可能宁愿改进你的哈希函数以产生更少的冲突。