DiskBackedPartition

为什么开发DiskBackedPartition?

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

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

DiskBackedPartition的数据接收接口

DiskBackedPartition也用Map<I, Vertex<I, V, E>> 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的运算都有单独的边的输入输出文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值