我写了这个创建矩阵的小代码。矩阵的大小为500 x 100 000.矩阵的元素是大小为10的双精度矢量。 我希望这个对象的内存大小应该接近:500 x 100 000 x 10个八位字节= 500 MB。 但是当我使用g ++编译它时,该对象需要5GB。 你知道为什么这个物体太重了吗?
以下是代码:
int main(int argc, const char * argv[]) {
vector<vector<vector<double>>> truc;
truc.resize(500);
for (int i =0; i<500; i++) {
truc[i].resize(100000);
for (int j=0; j<100000; j++) {
truc[i][j].resize(10);
}
}
我用命令编译它:
g++ -std=c++11 -O3 main.cpp -o main
答案 0 :(得分:1)
以下是标准所说的用于存储double
(强调我的)的字节数:
§3.9.1
有三种浮点类型:float,double和long double。 double类型至少提供 与float一样精确,long double类型提供至少与double相同的精度。 float类型的值集是double类型的值集的子集;价值观 double类型的类型是long double类型的值集的子集。 的价值表示 浮点类型是实现定义的。整数和浮点类型统称为算术 类型。标准模板std :: numeric_limits(18.3)的特化应指定最大值 和实现的每种算术类型的最小值。
因此,所需的空间量完全取决于编译器的实现。
如评论中所述,sizeof(double)
将显示在您的计算机上存储双倍所需的字节数。
答案 1 :(得分:0)
仅针对实际的double
,您需要500*100000*10*sizeof(double)
个字节。 sizeof(double)
通常是8个字节,可以带来4,000,000,000个字节。
此外,std::vector
本身需要一些空间用于管理数据的内部字段:例如在gcc
的64位Linux上,sizeof(std::vector<double>)
为24.您创建了总共(1 + 500 + 500 * 100000)std::vector
个对象,这些对象本身达到1,200,012,024个字节。 / p>
您可能想要考虑使用稀疏数据结构,该结构只显示非零条目,如果这对您处理的数据类型是可行的。 The Eigen matrix library作为可能的候选人出现在我的脑海中。
答案 2 :(得分:0)
在内存中,double是8字节= 8 oct。
向量使用的内存是:
// size of vector + size of type * n.elements
sizeof(std::vector<double>) + (sizeof(double) * n_elem);
所以,向量&lt;双&gt; 10个元素的大小为:24 +(8 * 10)= 104字节/ oct ;
但是你有一个这种类型的矢量矢量,所以:
24 + [24 + (24 + 8*10) * 100 000] * 500 ~ 5Go.
答案 3 :(得分:0)
double
不是八位字节。八位字节是一组8位,相当于单个char
(大多数实现)。 double
的大小取决于实现,但通常大小为8 BYTES,相当于8个八位字节。
因此,将预期的内存使用量乘以8
,以获得内存使用量的下限。请记住,每个向量都将使用额外的内存(例如,跟踪他们管理的double
组) - 并且向量truc
包含500*100000 = 50,000,000
个向量。你的计算根本没有考虑到这些。