内存和矢量中的矢量不足
out of memory and vector of vectors
我正在实现一个距离矩阵,它计算每个点和所有其他点之间的距离,我有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类库有一些基于磁盘的集合类,但它不是免费的。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存