这是一个简单的C 程序,它具有大小参数,并分配了大小的整数数组。在具有32位体系结构的虚拟机上运行的Linux下,使用G 编制了程序。当该应用程序与参数(数组大小)上高于1073741823*我获得
时分割故障(核心倾倒)
错误,并且值略小于我得到的。
丢弃了'std :: bad_alloc'
的实例后终止调用 什么():std :: bad_alloc中止(核心倾倒)
这是代码:
/* dynamicAlloc.cpp */
#include <iostream>
#include <stdlib.h> //for atoi
#include <cstdlib> // for rand() and srand()
#include <ctime> // for time()
using namespace std;
#define STR_LEN 256
int main(int argc, char* argv[])
{
srand(time(0));
unsigned int iArraySize = 1;
if(argc < 2)
return -1;
iArraySize = atoi(argv[1]);
int *pnValue = new int[iArraySize];
if(pnValue == NULL)
{
cout << "cannot allocate array" << endl;
return -2;
}
for(unsigned int iCounter = 0; iCounter < iArraySize; iCounter++)
{
pnValue[iCounter] = rand();
}
delete[] pnValue;
return 0;
}
为什么我会遇到两个不同的错误?
同样,如果我有一个非常大的数据,这些数据需要数十亿个数据进行处理/按摩,我是否必须使用数据库来处理如此大量的数据,还是还有另一种处理大数据集的方法?
感谢您阅读
*1073741823 =(2 ^ 32(位地址))/4(字节中的int size))-1
更新
ulimit -a的输出是:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 3808
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 3808
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
RAM大小配置为512MB。我以为每个程序都有自己的虚拟页面(对于32位拱门,我认为是4GB),然后我可以使用所有虚拟内存。
您在32位计算机上没有4千兆字节的内存。您总共有4个演出。您的程序可以访问的内容少。
您获得了具有如此巨大价值的Segfault,因为您正在创建一个非法地址。基础机械甚至没有机会尝试分配该内存。它甚至在尝试进行分配之前就进行了kaboom。
价值稍小,地址有效,但有些东西阻止您分配大量内存。您可能没有那么多的内存,或者您可能会有一个限制,从而阻止您采取那么多的内存。如果这是一个软限制,则可以提高它。如果这是一个硬限制,则需要SYS Admin特权来提高它。
您是否可以尝试ulimit -a
查看当前堆的大小,也许还有ulimit -s unlimited
,然后检查您的程序是否开始表现更好?另外,用于虚拟机的RAM有多少?
另外,为什么您认为您可以占用所有32位地址空间?您确实有内核和其他装入内存中的东西。
带有32位系统,您可以解决4个GIB。如果您尝试分配更多,则会从系统中获得细分故障。当您分配少于4个GIB时,new
会引发异常,因为它不能分配太多。还有静态数据和堆栈,可以在4个GIB地址空间中占用空间。