内存和矢量中的矢量不足

out of memory and vector of vectors

本文关键字:内存      更新时间:2023-10-16

我正在实现一个距离矩阵,它计算每个点和所有其他点之间的距离,我有100000个点,所以我的矩阵大小将是100000 x 100000。我使用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;
}
} 

100000 x 100000矩阵?快速计算表明为什么这永远不会奏效:

100000 x 100000 x 8 (bytes) / (1024 * 1024 * 1024) = 74.5 gigabytes...

即使有可能分配这么多内存,我也非常怀疑这是否是解决真正问题的有效方法。

如果你想对大型数据集进行某种几何处理,你可能会对某种空间树结构感兴趣:kd树、四叉树、r树?

100,000 * 100,000 = 10,000,000,000 ~= 2^33

很容易看出,在32位系统中,对于如此大的数据库,内存不足是有保证的,甚至不需要计算我们找到的元素数量,而不是使用的字节数量。

即使在64位系统中,操作系统也不太可能允许您拥有如此多的内存[还请注意,您实际上需要更多的内存,这也是因为您分配的每个元素都远不止一个字节。]

你知道100000乘以100000就是100亿吗?如果将距离存储为32位整数,则需要400亿字节,即37.5 GB。这可能比你拥有的RAM更多,所以这是不可行的。

100000 x 100000 x sizeof(double)=大约80GIG(有8个字节的double),没有向量的开销。

除非你在一台非常大的机器上,否则这种情况不太可能发生。看看使用某种类型的数据库或C/C++集合库中的一个,它会将大量数据溢出到磁盘。

Rogue Wave的SourcePRO类库有一些基于磁盘的集合类,但它不是免费的。