頂点のデータ型として文字列を作成できますか。動的データ型を使用できないと言われていますが、頂点にデータを追加し続けたいとします。どうすればよいですか? 配列を使用することを考えていましたが、サイズがわかりません。文字列を使用すると問題が発生しますか?(文字列に連結し続けます)
2 に答える
ドキュメントでは非 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<>()
出力ファンクターを使用)。
アップデート
上記のアプローチは機能しているように見えるかもしれませんが、次のようないくつかの理由で使用しないでください。
- 動的メモリ処理では、すべてのデータがメモリに収まるようにする必要がありますが、大規模なデータセットには当てはまらない場合があります
- 頂点およびエッジ オブジェクトのディスクへの書き込み/ディスクからの読み取り方法が原因で、任意の頂点/エッジ オブジェクトに対してデストラクタが呼び出される保証はなく、(少なくとも) リソース (メモリなど) につながる可能性があります。リーク。
要するに、ドキュメントには、このアプローチを禁止する正当な理由があります。
頂点データ型としての動的ベクトルの限定的なサポートが最近Graphchiに追加されました:http ://code.google.com/p/graphchi/wiki/DynamicVertexData