DiskBackedPartition

为什么开发DiskBackedPartition?

默认的Partition的实现是SimplePartition,它用一个ConcurrentMap> vertexMap;存储本partition的vertex id和vertex的映射信息,所有的信息都在内存里。当数据量大时,会出现OOM。

DiskBackedPartition是一种大数据量的实现。主要目的是借助本地文件系统,如果本Partition的数据较多,则序列化到磁盘。序列化之后则释放内存,为接收其他数据做准备。

DiskBackedPartition的数据接收接口

DiskBackedPartition也用Map> vertexMap;存储数据。

  • vertexMap数据合并
    有新的数据到达时,会依次判断到达的顶点,判断vertexMap是否已经有此顶点,如果有,则合并value和edges。如果没有则,把此vertex放到vertexMap。
  • 按边判断
    为了防止超级顶点造成内存溢出问题,不按顶点的数量进行判断是否数据量过多,而是按vertexMap中所有vertex的边的数量判断。超过设定的阈值时,把
  • 按vertex id的顺序序列化
    但是当vertexMap数据量过多时,把整个vertexMap按vertex id有序的方式,存储到本地的文件中。然后对vertexMap进行重新初始化,用于接新的数据。
  • 每个Vertex存储的信息
vertex id;//顶点的id
value; // 顶点的值
outedges; //边的信息
halt; //是否停止的标志
  • 文件合并
    数据加载完之后,会存在几个序列化的文件。这几个文件的内部都是按vertex id有序。并且一个顶点的信息可能被序列化到几个文件中。需要对数据进行合并。合并时,需要对vertex id相同的顶点进行合并成一个顶点。并且合并之后的顶点按vertex id有序。

迭代计算的输入数据,输出数据

合并之后,作为superstep0的输入,superstep0的对每个vertex的输出,保存在一个输出文件里。superstep0结束之后,关闭输出文件。superstep1开始计算时,superstep0的输出文件作为superstep1的输入。以此类推。

顶点和边的分离

如果顶点加载之后,顶点的边的信息不变,则可以不用每次都把边的信息重复的存储一遍。增加EDGES_IMMUTABLE变量,当EDGES_IMMUTABLE为true时,则把边信息存储在单独的文件中,则每轮计算都从边文件读取,运算时,不需要保存边的信息。如果边的值每轮计算可能变化,则边信息还是不能作为不变的文件为各超级步使用。但是可以考虑像顶点文件一样,每一轮superstep的运算都有单独的边的输入输出文件。

你可能感兴趣的:(graphdb)