Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 大数据集和小数据集的多重索引:空间效率低下?_C++_Database Design_Boost Multi Index - Fatal编程技术网

C++ 大数据集和小数据集的多重索引:空间效率低下?

C++ 大数据集和小数据集的多重索引:空间效率低下?,c++,database-design,boost-multi-index,C++,Database Design,Boost Multi Index,我根本不是数据库设计方面的专家,所以在我尝试将其翻译成CS术语之前,我会将我的需求简单地说出来:我正在尝试找到一种正确的方法,在一个潜在的非常大的数据集(比如说几次)中,快速迭代大的数据子集(比如说100Mo的double)。 我的对象基本上由4个整数(键)和值组成,一个简单的结构(1双1短)。 因为我的键只能接受少量的值(几百个),所以我认为将数据保存为树是有意义的(按键1个深度,值是叶子,至少在我的天真视图中很像XML的XPath) 我希望能够基于键值/这些键值的函数遍历叶的子集。要过滤的键

我根本不是数据库设计方面的专家,所以在我尝试将其翻译成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个索引就足够了

几年前,我在我的博客中提供了一个例子,展示了如何以一种几乎完全符合您特定场景的方式来实现这一点:

我们提供了源代码,希望您只需稍加修改即可使用,以满足您的需要。同一博客中的一系列文章也提供了该结构的理论依据:

这背后的数学不是琐碎的,你可能想安全地忽略它:如果你需要帮助理解它,不要犹豫在博客文章上发表评论

这个容器使用多少内存?在典型的32位计算机中,对象的大小为4*sizeof(int)+sizeof(double)+sizeof(short)+padding,通常产生32个字节(在Win32上通过Visual Studio检查)。MultiIndex为每个索引增加了3个字(12字节)的开销,因此对于容器的每个元素

32+6*12=104字节+填充


再次,我在Win32上使用Visual Studio进行了检查,获得的大小是每个元素128字节。如果您有10亿(10^9)个元素,那么32位是不够的:使用64位操作系统很可能会使OBEJCT的大小增加一倍,因此所需的内存将达到256 GB,这是一个非常强大的野兽(不知道您是否正在使用如此巨大的东西)。

使用Boost.MultiIndex,您不需要多达12个索引(顺便说一句,4个元素的排列数是4!=24,而不是12)以覆盖包含4个键的特定子集的所有查询:由于使用了6个索引,并且稍微有点独创性,6个索引就足够了

几年前,我在我的博客中提供了一个例子,展示了如何以一种几乎完全符合您特定场景的方式来实现这一点:

我们提供了源代码,希望您只需稍加修改即可使用,以满足您的需要。同一博客中的一系列文章也提供了该结构的理论依据:

这背后的数学不是琐碎的,你可能想安全地忽略它:如果你需要帮助理解它,不要犹豫在博客文章上发表评论

此容器使用多少内存?在典型的32位计算机中,对象的大小为4*sizeof(int)+sizeof(double)+sizeof(short)+padding,通常产生32个字节(在Win32上通过Visual Studio进行检查)。在这个Boost.MultiIndex中增加了3个字(12个字节)的开销每个索引,所以对于容器的每个元素

32+6*12=104字节+填充


再次,我在Win32上与Visual Studio进行了检查,得到的大小是每个元素128字节。如果您有10亿(10^9)个元素,那么32位是不够的:使用64位操作系统很可能会使OBEJCT的大小加倍,因此所需的内存将达到256 GB,这是一个非常强大的野兽(不知道您是否正在使用如此庞大的数据。)

如果您有几GB的数据,很可能需要一个更复杂的系统来有效地处理它。Un