用于存储大型数据集的数据结构 [关闭]

Posted

技术标签:

【中文标题】用于存储大型数据集的数据结构 [关闭]【英文标题】:Data structure for storing large datasets [closed] 【发布时间】:2015-03-11 02:37:35 【问题描述】:

我有数百万个需要存储在某些数据结构中的随机正负 32 位整数。如果数据结构已经包含该特定值,则该函数必须退出。您能否建议一些可以实现这一目标的高效内存数据结构? 谢谢

【问题讨论】:

Dataset,dataset,也许可以使用某种set data structure?至少开始。 当你说“百万”时,他们是多少? 16GB 是现代计算机中常见的内存大小,它将容纳 40.96 亿个可能以 32 位表示的数字中的每一个。使用位图,您可以将其减少 32 倍,即 0.5GB。 随机正负32位整数? 如果存储它们是一个问题,不要,一旦需要就买一个新的。 (天真地存储 all 需要 16GB - 问题?)功能?如果the data structure 没有not contain that particular value,则不需要退出的函数?尝试并提供足够的信息来找到解决方案:要支持哪些操作以及以何种顺序(允许在查询之间插入和删除、仅插入或不插入;值更改)。哪些操作经常发生足以关注效率,了解数据是否有帮助? 【参考方案1】:

如果你愿意接受一些误报,我建议你使用Bloom Filter。

每个元素只需使用 10 位和 7 个哈希函数,您的误报概率就会低于 1%,而且根本不会出现误报。

【讨论】:

【参考方案2】:

在内存效率方面很难击败std::vector,因为所有数据都打包在一起。而且由于您必须快速进行搜索,因此最好将它们排序存储,以便您可以对它们进行二进制搜索。

除非你可以:

使用线性预测压缩数字本身并以差分方式(或任何更高阶多项式)对其进行编码:这使打包效率更高,但无法直接访问(广告二进制搜索) 如果数字彼此独立并且是时不变计算的结果,请不要存储它们,而是在需要时重新计算。

在任何情况下,您占用的内存越少,就越难找到要搜索的数字(这是一个物理原理,与编程无关,但与信息论有关)

【讨论】:

【参考方案3】:

您还没有说是否需要以未排序的顺序维护元素 - 我假设不需要......

如果数据结构已经包含该特定值,则函数必须退出。

您有大约 40 亿个可能的 32 位值,而您正在谈论一些看似“很少”的数百万个数字。对我来说,这暗示了这样的事情:

vector<uint16_t> bucket[65536];

对于 Q 百万个元素,您将平均每个桶 15*Q 个元素...足以使 std::vector&lt;&gt; 的开销仅占内存使用的一小部分,但又不足以快速重新排序添加后的存储桶或 - 或者 - 进行线性搜索。

如果您认为 K 会更大,请制作更多的桶来覆盖更小的值范围。如果您不太确定,您可能需要一些动态调整大小,或者完全找到不同的方法。如果 K 接近 128,您可能希望对整个事情使用 bitset

给定 v 的逻辑值,您可以使用屏蔽高位(例如 (uint32_t)v &gt;&gt; 16)的组合来识别存储桶,并使用二进制搜索或插入例如桶内v &amp; 65535....

【讨论】:

以上是关于用于存储大型数据集的数据结构 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

大型网格数据集的存储

寻找用于清理/注释大型数据集的 python 数据结构

(预)处理存储在 json 中的大型数据集的最有效方法是啥?

R中用于大型复杂调查数据集的方法?

在 phpMyAdmin SQL 表中存储大型数据集的有效方法

用于 Web 应用程序的大型数据集 - 为每个查询使用 API 或本地存储在数据库中?