目标是建造非常大的树。我说的非常大,指的是几亿个节点,只有几个千兆字节。
问题是普通的数据结构有太多的开销。我不能拥有"node“对象和子”map“。我需要以非常紧凑的方式将其直接编码到内存中。
因此,我想知道是否有一些将整数作为键和值的树的内存高效实现,而不在内部使用对象,因此需要(4字节的键+4字节的值+4字节的子索引+几个字节的空闲散列空间=每个条目平均15个字节),这将允许我使用外部映射int<->键和int<->值来搜索树。
有没有人?
PS:在内部使用对象至少要多使用5倍的空间:8个引用+4个额外的散列空间+ 16个对象头+8个键引用+8个值引用+8个父引用+8个子引用+ (16 + x)子映射obj =每个条目近76+x个字节。(例如,我们的默认实现每个条目大约需要100个字节)
发布于 2011-09-01 22:20:23
这实际上不是Java特有的问题,而是一个更一般的概念。
试试这个:http://webdocs.cs.ualberta.ca/~holte/T26/tree-as-array.html
关键是使用基元数组,以避免对象开销。
发布于 2011-09-01 22:21:33
我不知道有什么具体的树实现可以做到这一点,但VTD-XML在内部使用带有指向缓冲区的指针的标记数组在内部表示XML树( DOM)。也许你可以从他们的解决方案中获得灵感?
发布于 2011-09-01 22:26:37
你可能会发现这个库可以帮助你达到你想要的效果--它是专门为将值存储为原语而设计的,并且在幕后做了一些字节码的破解,给人一种存储对象的错觉。在以下情况下使用它:
...您希望在内存中高效地存储大型数据集合。这个库可以极大地减少完整的GC时间,并减少内存消耗。
它没有特定的Tree集合,但它可能会做到这一点,这取决于您需要什么。
http://code.google.com/p/vanilla-java/wiki/HugeCollections
https://stackoverflow.com/questions/7271632
复制相似问题