用于存储大型数据集的数据结构 [关闭]
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<>
的开销仅占内存使用的一小部分,但又不足以快速重新排序添加后的存储桶或 - 或者 - 进行线性搜索。
如果您认为 K 会更大,请制作更多的桶来覆盖更小的值范围。如果您不太确定,您可能需要一些动态调整大小,或者完全找到不同的方法。如果 K 接近 128,您可能希望对整个事情使用 bitset
。
给定 v
的逻辑值,您可以使用屏蔽高位(例如 (uint32_t)v >> 16
)的组合来识别存储桶,并使用二进制搜索或插入例如桶内v & 65535
....
【讨论】:
以上是关于用于存储大型数据集的数据结构 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
(预)处理存储在 json 中的大型数据集的最有效方法是啥?