C++ 大数据集和小数据集的多重索引:空间效率低下?
我根本不是数据库设计方面的专家,所以在我尝试将其翻译成CS术语之前,我会将我的需求简单地说出来:我正在尝试找到一种正确的方法,在一个潜在的非常大的数据集(比如说几次)中,快速迭代大的数据子集(比如说100Mo的double)。 我的对象基本上由4个整数(键)和值组成,一个简单的结构(1双1短)。 因为我的键只能接受少量的值(几百个),所以我认为将数据保存为树是有意义的(按键1个深度,值是叶子,至少在我的天真视图中很像XML的XPath) 我希望能够基于键值/这些键值的函数遍历叶的子集。要过滤的键组合将有所不同。我认为这就是所谓的横向搜索?C++ 大数据集和小数据集的多重索引:空间效率低下?,c++,database-design,boost-multi-index,C++,Database Design,Boost Multi Index,我根本不是数据库设计方面的专家,所以在我尝试将其翻译成CS术语之前,我会将我的需求简单地说出来:我正在尝试找到一种正确的方法,在一个潜在的非常大的数据集(比如说几次)中,快速迭代大的数据子集(比如说100Mo的double)。 我的对象基本上由4个整数(键)和值组成,一个简单的结构(1双1短)。 因为我的键只能接受少量的值(几百个),所以我认为将数据保存为树是有意义的(按键1个深度,值是叶子,至少在我的天真视图中很像XML的XPath) 我希望能够基于键值/这些键值的函数遍历叶的子集。要过滤的键
因此,为了避免对相同的键进行n次比较,理想情况下,我需要通过每个键的排列对数据结构进行索引(12种可能性:!4/!2)。这似乎就是
boost::multi_index
的目的,但是,除非我忽略了smth,否则这将实际构建12个树结构,将指向我的值节点的指针存储为叶子。考虑到我的值相对于键的大小很小,我猜这将是非常没有空间效率的
如果您对我应该使用的设计/数据结构提出任何建议,或提供有关这些主题的简明教材,我们将不胜感激。和是使用的两个主要索引,但它们不是唯一的索引。你应该探索它们
和是使用的两个主要索引,但它们不是唯一的索引。你应该探索它们
老实说,这取决于访问它的算法。如果这个结构需要驻留,并且您可以负担内存消耗,那么就这样做。multi_索引很好,但如果它位于头中,则会破坏编译时间
如果只需要一次遍历,那么构建结构将是一种浪费。像这样的东西可能是一个很好的起点。老实说,这取决于访问它的算法。如果这个结构需要驻留,并且您可以负担内存消耗,那么就这样做。multi_索引很好,但如果它位于头中,则会破坏编译时间
如果只需要一次遍历,那么构建结构将是一种浪费。类似的内容可能是一个很好的起点。使用Boost.MultiIndex,您不需要多达12个索引(顺便说一句,4个元素的排列数是4!=24,而不是12)来覆盖包含4个键的特定子集的所有查询:多亏了使用,而且稍微有点独创性,6个索引就足够了 几年前,我在我的博客中提供了一个例子,展示了如何以一种几乎完全符合您特定场景的方式来实现这一点: 我们提供了源代码,希望您只需稍加修改即可使用,以满足您的需要。同一博客中的一系列文章也提供了该结构的理论依据:
再次,我在Win32上使用Visual Studio进行了检查,获得的大小是每个元素128字节。如果您有10亿(10^9)个元素,那么32位是不够的:使用64位操作系统很可能会使OBEJCT的大小增加一倍,因此所需的内存将达到256 GB,这是一个非常强大的野兽(不知道您是否正在使用如此巨大的东西)。使用Boost.MultiIndex,您不需要多达12个索引(顺便说一句,4个元素的排列数是4!=24,而不是12)以覆盖包含4个键的特定子集的所有查询:由于使用了6个索引,并且稍微有点独创性,6个索引就足够了 几年前,我在我的博客中提供了一个例子,展示了如何以一种几乎完全符合您特定场景的方式来实现这一点: 我们提供了源代码,希望您只需稍加修改即可使用,以满足您的需要。同一博客中的一系列文章也提供了该结构的理论依据:
再次,我在Win32上与Visual Studio进行了检查,得到的大小是每个元素128字节。如果您有10亿(10^9)个元素,那么32位是不够的:使用64位操作系统很可能会使OBEJCT的大小加倍,因此所需的内存将达到256 GB,这是一个非常强大的野兽(不知道您是否正在使用如此庞大的数据。)如果您有几GB的数据,很可能需要一个更复杂的系统来有效地处理它。Un