内存组织大数据

时间:2015-03-16 15:18:26

标签: c++ oop memory bigdata

我有一个持有4个整数的类。我需要创建上述类的1百万个实例。我应该怎么创建..?

天真的做法是: Class arrMyObjectes [1000000];

但它需要100万* sizeof(obj)= 16百万字节的连续内存块****,这很难获得......

更好的方法是: * Class arrMyObjectes [1000000];

现在我们将使用 new 创建一个1000000个对象,我们将把指针存储在上面提到的指针数组中......即使在这种情况下我们也需要1百万* sizeof(指针)= 400万字节的连续内存块...也似乎很难得到..

还有其他更好的方法。

2 个答案:

答案 0 :(得分:3)

std::deque<Class> objects(1000000);std::list<Class> objects(1000000);怎么样?这些容器是不连续的。

如果实现尝试为这些构造函数获取一个连续的块,您可以单独生成它们:

std::deque<Class> objects;
for(unsigned i = 0; i < 1000000; ++i)
    objects.emplace_back();

std::list相同。

参考: std::deque std::list

答案 1 :(得分:2)

如果您有2GB或更多RAM,那么16 MB或4 MB并不难获得。如果你迭代它,它实际上可能是更好的性能。

否则,您可以使用Galik提到的非连续容器,但是对于小项目(并且您的类是16个字节),它实际上并不是最佳的,因为它会碎片化内存并假设您使用的是64位机器每个项目增加8个字节,用于指针。如果您使用的是32位机器,则需要4个额外的字节。

这意味着您实际上使用的是24 MB(碎片)内存而不是16。

简短版本:如果你操作小项目(比如你的类),坚持使用向量,它将提高性能和内存使用。 16 MB的连续内存现在已不再那么多了。