我正在实施一个距离矩阵来计算每个点和所有其他点之间的距离,我有100,000个点,所以我的矩阵大小将是100,000 x 100,000。我使用vector<vector<double> > dist
实现了这一点。但是,对于这个大数据大小,它会给出内存错误。以下是我的代码,任何帮助将非常感谢。
vector<vector<double> > dist(dat.size()) vector<double>(dat.size()));
size_t p,j;
ptrdiff_t i;
#pragma omp parallel for private(p,j,i) default(shared)
for(p=0;p<dat.size();++p)
{
// #pragma omp parallel for private(j,i) default(shared)
for (j = p + 1; j < dat.size(); ++j)
{
double ecl = 0.0;
for (i = 0; i < c; ++i)
{
ecl += (dat[p][i] - dat[j][i]) * (dat[p][i] - dat[j][i]);
}
ecl = sqrt(ecl);
dist[p][j] = ecl;
dist[j][p] = ecl;
}
}
答案 0 :(得分:8)
100000 x 100000矩阵?快速计算显示为什么它永远不会起作用:
100000 x 100000 x 8 (bytes) / (1024 * 1024 * 1024) = 74.5 gigabytes...
即使有可能分配这么多内存,我也非常怀疑这是否是一个真正问题的有效方法。
如果您希望对大型数据集进行某种几何处理,您可能会对某种空间树结构感兴趣:kd-trees,quadtrees,r-trees可能?
答案 1 :(得分:2)
100,000 * 100,000 = 10,000,000,000 ~= 2^33
很容易看出,在32位系统中 - 保证了这么大的数据库的内存不足,甚至没有计算我们发现的元素数量,而不是使用的字节数。
即使在64位系统中,操作系统也不太可能允许你使用这么多内存[还要注意你实际上需要更多的内存,因为你分配的每个元素都远远超过一个字节。]
答案 2 :(得分:1)
你知道10万次10万次是10亿次吗?如果您将距离存储为32位整数,那将是400亿字节,或37.5 GB。这可能比你有更多的RAM,所以这是不可行的。
答案 3 :(得分:1)
100,000 x 100,000 x sizeof(double)=大约80GIG(8字节双精度),没有向量的开销。
除非你在一台非常大的机器上,否则这种情况不太可能发生。 查看使用某种数据库或一个将大数据泄露到磁盘的C / C ++集合库。
Rogue Wave的SourcePRO类库有一些基于磁盘的集合类,但它不是免费的。