Graphchi中的顶点数据类型

时间:2012-08-30 13:43:19

标签: graph types vertex graphchi

我们可以将字符串作为顶点数据类型;有人提到我们不能使用动态数据类型但是我想继续向顶点添加一些数据我该怎么办? 我在考虑使用数组但是大小未知;那么使用字符串会导致任何问题吗? (我将继续连接到字符串)

2 个答案:

答案 0 :(得分:1)

虽然documentation明确禁止非POD类型(禁止std::vector<>std::string等),但似乎可以使其有效(基于由报告的错误报告的错误)第278页中的编译器和运行时:

  • 确保您的类型具有默认构造函数
  • 实施专门针对您的类型的graphchi::parse<>()模板功能

例如,(ab)使用向量来存储单元int(免责声明:为概念证明而非效率而编写的示例):

class VertexData
{
  std::vector<int> data;

public:
  // default ctor
  VertexData()
  {
    setData(0);
  }

  // convenience ctor
  VertexData(int v)
  {
    setData(v);
  }

  void setData(int v)
  {
    data.clear();
    data.push_back(v);
  }

  int getData()
  {
    return data.at(0);
  }
};

namespace graphchi
{
  template<>
  void parse<VertexData>(VertexData& vd, const char* s)
  {
    // NOTE: stoi is C++11 feature, use your favorite C++03 equivalent if needed
    int x = std::stoi(s);
    vd.setData(x);
  }
}

请注意,默认的二进制输出(* .vout)将写入VertexData本身的二进制内容,这意味着vector<>和其他动态数据类型的原始指针(因此文档的禁止)。要查看实际值,请按照this SO thread中的说明操作(使用带有输出仿函数的graphchi::foreach_vertices<>())。

<强>更新

虽然上述方法似乎有效,但不应将其用于多种原因,包括:

  • 动态内存处理要求所有数据都适合内存,大型数据集可能不是这种情况
  • 由于顶点和边缘对象从磁盘写入/读取的方式,无法保证为任何顶点/边缘对象调用析构函数,这些对象可以(至少)导致资源(例如,记忆)泄漏。

简而言之:文档有充分的理由禁止这种方法。

答案 1 :(得分:0)

最近向Graphchi添加了对动态矢量作为顶点数据类型的有限支持:http://code.google.com/p/graphchi/wiki/DynamicVertexData