Malloc内存问题

首先我注意到,当我malloc内存与calloc的内存占用是不同的。 我正在处理几个GB的数据集。 这个数据是随机的。

我期望我可以malloc大量的内存,并读取任何随机数据是在一个浮动。 然而,从进程查看器的内存占用情况来看,内存显然没有被声明(相比于calloc,我看到一个很大的脚印)。 我运行一个循环来将数据写入内存,然后我看到内存占用率攀升。 我是否正确地说,直到我初始化它之前,内存并没有被实际声明?

最后,我通过1024 * 1024 * 128字节(1024 MB的stream程查看器)后,我开始获得segfaults。 然而,Calloc似乎初始化了1 GB的全部数量。 为什么在初始化malloc的for循环的内存时出现segfaults,这个数字为128MB,为什么内存占用量是1024MB?

如果从内存malloc大量,然后从它读取我得到什么(因为进程查看器显示几乎没有足迹,直到我初始化)?

最后有没有办法让我分配超过4GB? 我正在testing内存层次结构性能。

代码#2:

long long int i; long long int *test=(long long int*)malloc(1024*1024*1024); for (i=0;i<1024*1024*128;i++) test[i]=i; sleep(15); 

Solutions Collecting From Web of "Malloc内存问题"

1-如果您正在使用32位计算机,则不能分配超过2GB的变量。

2-如果您正在使用64位计算机,则可以分配的RAM和交换内存的总数尽可能多,但是,将所有分配给一个变量需要一个可能无法使用的大块内存。 尝试一个链接列表,其中每个元素只有1 MB的分配,你可以实现总共分配更高的内存。

3-如你和Sharth所指出的,除非你使用你的内存,否则linux将不分配它。

一些说明:

  1. 正如注释,Linux直到使用它才会真正分配内存。
  2. 当您使用calloc而不是malloc时,它会清除您请求的所有内存。 这相当于使用它。

#2因为sizeof(long long int) > 8或者你的malloc返回NULL而导致segfault失败。 如果您要求1 GB的RAM,这是非常可能的。

更多关于#2的信息 从你的128 MB的评论我得到的想法,你可能没有意识到发生了什么事情。 因为你把数组指针声明为long long int ,每个数组元素的大小是8个字节。 1024/8 == 128这就是为什么你的循环工作。 无论如何,当我尝试它时,它就这样做了。

你的例子代码中的for循环实际上是触摸1GB的内存,因为它是索引128 * 1024 * 1024 long long ,每long long是8个字节。