1

頂点のデータ型として文字列を作成できますか。動的データ型を使用できないと言われていますが、頂点にデータを追加し続けたいとします。どうすればよいですか? 配列を使用することを考えていましたが、サイズがわかりません。文字列を使用すると問題が発生しますか?(文字列に連結し続けます)

4

2 に答える 2

1

ドキュメントでは非 POD 型を明示的に禁止していますが ( などを許可しstd::vector<>ていませんstd::string)、それを機能させることは可能のようです (コンパイラーおよび rev. 278 のランタイムによって報告されたエラーに基づいて):

  • 型にデフォルトのコンストラクターがあることを確認してください
  • graphchi::parse<>()型に特化したテンプレート関数を実装する

たとえば、(ab) vector を使用して単一の 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 に答える