C++ 内存不足和向量的向量

C++ 内存不足和向量的向量,c++,visual-c++,data-structures,vector,C++,Visual C++,Data Structures,Vector,我正在实现一个距离矩阵,它计算每个点和所有其他点之间的距离,我有100000个点,所以我的矩阵大小将是100000 x 100000。我使用vectordist实现了这一点。但是,对于如此大的数据量,它会产生内存不足错误。以下是我的代码,任何帮助都将不胜感激 vector<vector<double> > dist(dat.size()) vector<double>(dat.size())); size_t p,j; ptrdiff_t i; #pragma

我正在实现一个距离矩阵,它计算每个点和所有其他点之间的距离,我有100000个点,所以我的矩阵大小将是100000 x 100000。我使用
vectordist
实现了这一点。但是,对于如此大的数据量,它会产生内存不足错误。以下是我的代码,任何帮助都将不胜感激

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;
}
} 
向量距离(dat.size())向量(dat.size()); 尺寸p,j; ptrdiff_t i; #pragma omp并行专用(p、j、i)默认值(共享)
对于(p=0;p
100000*100000=1000000000~=2^33)

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


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

100000*100000=1000000000~=2^33

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


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

一个100000 x 100000的矩阵?一个快速的计算说明了为什么这永远不会起作用:

100000 x 100000 x 8 (bytes) / (1024 * 1024 * 1024) = 74.5 gigabytes...
即使有可能分配这么多内存,我也非常怀疑这是否是解决实际问题的有效方法


如果您希望在大型数据集上进行某种几何处理,您可能会对某种空间树结构感兴趣:,也许?

一个100000 x 100000矩阵?快速计算可以说明为什么这永远不起作用:

100000 x 100000 x 8 (bytes) / (1024 * 1024 * 1024) = 74.5 gigabytes...
即使有可能分配这么多内存,我也非常怀疑这是否是解决实际问题的有效方法


如果你想在大数据集上进行某种几何处理,你可能会对某种空间树结构感兴趣:,也许?

你知道100000乘以100000等于100亿吗?如果你将距离存储为32位整数,那将是400亿字节,或37.5 GB。这可能比你的内存要多o这是不可行的。

您知道100000乘以100000等于100亿吗?如果您将距离存储为32位整数,则会有400亿字节,或37.5 GB。这可能比您拥有的RAM更多,因此这是不可行的。

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

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

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

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

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


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

100亿个8字节的条目表示此数据结构需要80GB的内存。10亿个8字节的条目表示此数据结构需要80GB的内存。