Java中图表的空间高效表示?

时间:2009-10-24 16:13:04

标签: java graph-databases

我想要一个无向图,其中节点用一对标记(当前使用String []),并且可以任意链接到其他节点。我已经开始使用Hashtable类型了。事实证明,这对我来说不够节省空间 - 我打算拥有大约60,000个节点(最终远远超过这个数量)。

我应该如何实现这种图形以提高内存效率?相反,我应该考虑使用某种关系数据库吗?

3 个答案:

答案 0 :(得分:3)

如果空间效率是您的首要任务,那么您可以牺牲图形操作的时间效率并取消Hashtable(我假设您用于存储节点的标记链接)。只需切换到一个数组并承担在图形操作上比较标签值的成本:

public class Node {
    private Links[] links;

    // ... the ops ...

    public static final class Link {
        String label;
        Node   target;
    }
}

如果你想进一步挤压内存使用量,你的标签空间是有限的(即标签对于给定节点不是唯一的;例如“parent”是一次又一次出现的标签),那么考虑使用自定义{{ 1}}每flyweight pattern个类,因此您不会复制Label的实例。

答案 1 :(得分:1)

您主要关心的是序列化时磁盘上的大小,还是内存中的大小?

如果您担心内存中的大小,并且如果您不一定需要同时在内存中保存每个节点,则可能需要使用类似transparent activation之类的内容来研究使用某种类型的延迟加载db4o

答案 2 :(得分:0)

如果您需要持续的可扩展性,请考虑使用现有的图形数据库,例如Neo4J,它可以处理您描述的更大的图形(数百万或数十亿的关系)。我已经将它用于大约2500万个节点的图表,效果很好。