创建一百万个对象,每个对象有 12 个双打
Posted
技术标签:
【中文标题】创建一百万个对象,每个对象有 12 个双打【英文标题】:Creating a million objects with 12 doubles each 【发布时间】:2014-07-11 16:03:05 【问题描述】:我是一名中级程序员。我正在尝试创建一个模拟程序,该程序需要创建一个类的一百万个对象。这些对象中的每一个都将包含七个 12x12 矩阵。 (我知道这是很多内存)。我尝试使用二维向量。但是当我运行它时,它总是被操作系统(Ubuntu)杀死。我尝试使用“新”和 2D 双数组(因为我读到 new 会将内存放在堆上)。但是进程总是被杀死。
我按如下方式分配数组和对象向量
12x12 矩阵
ObjectMatrix = new double*[matSize];
for(int i = 0; i < matSize; ++i)
ObjectMatrix[i] = new double[matSize];
一百万个对象的向量,每个对象包含 7 个这样的 12x12 矩阵
for(int i=0;i<=1E6;i++)
ObjectVector *newObj = new Object();
ObjectVector.push_back(newObj);
有没有办法解决这个问题并创建一个包含一百万个或更多对象的向量?
【问题讨论】:
如果进程被操作系统杀死,可能是内存问题。您要求太多内存太快。我假设您的系统有足够的内存可以分配。 (还没算过)8 bytes * 144 doubles * 7 matrices * 1000000 objects = approx 7 gigs...
使用浮点数并检查 ulimit 命令。
另外,检查您的目标是 64 位应用程序。 32 位应用程序仅支持 4G 的地址空间。
您是否考虑过基于惰性评估的解决方案?也许您并不真正需要向量的所有元素的实际值,而只需要其中的一些。
【参考方案1】:
您应该在一块内存中创建矩阵。
double* matrix = new double[matSize*matSize];
这样可以节省 matSize*sizeof(double*) 内存。
您应该将对象创建为数组。
Object* objects = new Object[number];
在这里你可以再次节省很多不必要的指针。
【讨论】:
我还会在分配循环中添加一个 usleep() 以避免 cpu 拥抱。加上请求的大量内存,可能是内核杀死进程(回收过多系统资源)的原因 谢谢@dari ...但这没有用。我认为这个过程这次可以根据你的建议分配更多元素,但最终它被杀死了。 @AdityaG:你的系统有多少内存? cabbellicar123 计算出您需要大约 8 GB 或 RAM 来分配所有内存 @sergico ...我有 16GB ...!以上是关于创建一百万个对象,每个对象有 12 个双打的主要内容,如果未能解决你的问题,请参考以下文章