1

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

4

2 回答 2

1

尽管文档明确禁止非 POD 类型(禁止std::vector<>std::string),但似乎可以使其工作(基于编译器和运行时在 rev. 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<>以及其他动态数据类型(因此文档禁止)。要查看实际值,请按照此 SO 线程中的说明进行操作(使用graphchi::foreach_vertices<>()输出函子)。

更新

尽管上述方法似乎可行,但出于多种原因不应使用它,包括:

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

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

于 2012-12-18T16:49:40.957 回答
0

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

于 2013-01-23T02:12:15.633 回答