矩阵比cpp中的预期重10倍

时间:2016-01-20 11:32:33

标签: c++

我写了这个创建矩阵的小代码。矩阵的大小为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

4 个答案:

答案 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个向量。你的计算根本没有考虑到这些。