【发布时间】:2011-11-08 10:55:31
【问题描述】:
目标是建造非常大的树。 我所说的非常大是指数亿个节点,大约只有几 GB。
问题在于通用数据结构的开销太大。我买不起“节点”对象和子“地图”。我需要以非常紧凑的方式将其直接编码到内存中。
因此,我想知道是否存在一些以整数作为键和值的树的内存高效实现,而不在内部使用对象,因此需要(键的 4 字节 + 值的 4 字节 + 子索引的 4 字节 + 一些可用散列空间的字节数 = 每个条目平均 15 个字节),这将允许我使用外部映射 intkeys 和 intvalues 来搜索树。
有人吗?
PS:在内部使用对象至少使用 5 倍以上的空间:8 个引用 + 4 个额外的哈希空间 + 16 个对象头 + 8 个键引用 + 8 个值引用 + 8 个父引用 + 8 个子引用 + (16 + x) for children map obj = 每个条目将近 76+x 个字节。 (例如,我们的默认实现每个条目需要大约 100 个字节)
【问题讨论】:
-
在节点中保存对对象的引用会更有效率吗?这是否不需要为每个持有的项目提供一个额外的指针内存,以及一个额外的取消引用循环才能到达该项目?我在这里错过了什么吗?
-
我的意思是根本不在内部使用对象。内部只有一个(或几个)巨大的 int[] 数组。
-
是否必须使用Java? (否)SQL 数据库会是更好的选择吗?
-
每个节点有多少个子节点?除非该索引是指向实际子索引列表的指针,否则如何避免子索引每个节点只有四个字节?
-
@GregS:正如你所说,它是一个指针。一旦树有超过 2^32 / 16 = 2.38 亿个节点,8 个字节可能是必要的,或者更容易处理。
标签: java data-structures tree large-data