Graph 图形中的顶点数据类型
我们可以将字符串作为顶点数据类型;有人提到,我们不能使用动态数据类型,但假设我想继续向顶点添加一些数据,我该怎么做? 我曾考虑使用数组,但大小不详;那么使用字符串会导致任何问题吗?(我将继续连接到字符串)尽管明确禁止非POD类型(不允许Graph 图形中的顶点数据类型,graph,types,vertex,graphchi,Graph,Types,Vertex,Graphchi,我们可以将字符串作为顶点数据类型;有人提到,我们不能使用动态数据类型,但假设我想继续向顶点添加一些数据,我该怎么做? 我曾考虑使用数组,但大小不详;那么使用字符串会导致任何问题吗?(我将继续连接到字符串)尽管明确禁止非POD类型(不允许std::vector、std::string等),但似乎可以使其工作(基于编译器和运行时在rev.278中报告的错误): 确保您的类型具有默认构造函数 实现专门针对您的类型的graphchi::parse()模板函数 例如,(ab)使用向量存储singlul
std::vector
、std::string
等),但似乎可以使其工作(基于编译器和运行时在rev.278中报告的错误):
- 确保您的类型具有默认构造函数
- 实现专门针对您的类型的
模板函数graphchi::parse()
类顶点数据
{
std::矢量数据;
公众:
//默认选择器
VertexData()
{
setData(0);
}
//便利型电动自行车
顶点数据(int v)
{
setData(v);
}
无效设置数据(int v)
{
data.clear();
数据。推回(v);
}
int getData()
{
返回数据。在(0);
}
};
名称空间图
{
模板
无效解析(顶点数据与虚拟磁盘,常量字符*s)
{
//注意:stoi是C++11特性,如果需要,请使用您最喜欢的C++03等效工具
INTX=标准::stoi(s);
vd.setData(x);
}
}
请注意,默认的二进制输出(*.vout)将写入VertexData本身的二进制内容,这意味着在向量
和其他动态数据类型(因此文档禁止)的情况下使用原始指针。要查看实际值,请按照中的说明操作(使用带有输出函子的graphchi::foreach_顶点()
)
更新
尽管上述方法似乎可行,但出于以下原因,不应使用该方法:
- 动态内存处理需要将所有数据放入内存中,对于大型数据集可能不是这样
- 由于顶点和边对象写入磁盘/从磁盘读取的方式,无法保证对任何顶点/边对象调用析构函数,这可能(至少)导致资源(例如内存)泄漏
std::vector
、std::string
等),但似乎可以让它工作(基于编译器和运行时在rev.278中报告的错误):
- 确保您的类型具有默认构造函数
- 实现专门针对您的类型的
模板函数graphchi::parse()
类顶点数据
{
std::矢量数据;
公众:
//默认选择器
VertexData()
{
setData(0);
}
//便利型电动自行车
顶点数据(int v)
{
setData(v);
}
无效设置数据(int v)
{
data.clear();
数据。推回(v);
}
int getData()
{
返回数据。在(0);
}
};
名称空间图
{
模板
无效解析(顶点数据与虚拟磁盘,常量字符*s)
{
//注意:stoi是C++11特性,如果需要,请使用您最喜欢的C++03等效工具
INTX=标准::stoi(s);
vd.setData(x);
}
}
请注意,默认的二进制输出(*.vout)将写入VertexData本身的二进制内容,这意味着在向量
和其他动态数据类型(因此文档禁止)的情况下使用原始指针。要查看实际值,请按照中的说明操作(使用带有输出函子的graphchi::foreach_顶点()
)
更新
尽管上述方法似乎可行,但出于以下原因,不应使用该方法:
- 动态内存处理需要将所有数据放入内存中,对于大型数据集可能不是这样
- 由于顶点和边对象写入磁盘/从磁盘读取的方式,无法保证对任何顶点/边对象调用析构函数,这可能(至少)导致资源(例如内存)泄漏
简而言之:文档中有充分的理由禁止这种方法。最近将动态向量作为顶点数据类型的有限支持添加到Graphchi中:最近将动态向量作为顶点数据类型的有限支持添加到Graphchi中:
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);
}
}