一尘不染

Malloc内存问题

linux

首先,我注意到当我分配内存与calloc时,内存占用量是不同的。我正在使用数GB的数据集。此数据可以是随机的。

我以为我可以分配大量的内存并读取其中的任何随机数据,然后将其强制转换为浮点数。但是,在进程查看器中查看内存占用量时,显然并没有要求使用内存(与calloc相比,我看到了较大的占用空间)。我运行了一个循环,将数据写入内存,然后看到内存占用量攀升。
我是否正确地说,直到初始化内存才真正声明内存?

最后,当我传递1024 * 1024 * 128字节(在进程查看器中为1024 MB)后,我开始出现段错误。但是,Calloc似乎初始化了最多1
GB的全部空间。 为什么在带有malloc的for循环中使用此数字128MB初始化内存中的内存时会出现段错误,为什么内存占用量显示1024MB?

如果从内存中分配大量内存,然后从中读取我得到了什么(因为在初始化之前进程查看器几乎不显示占用空间)?

最后,有什么办法可以分配超过4GB的内存吗? 我正在测试内存层次结构性能。

#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);

阅读 276

收藏
2020-06-03

共1个答案

一尘不染

1-如果在32位计算机上工作,则不能为变量分配超过2GB的空间。

2-如果您在64位计算机上工作,则可以总共分配RAM +
Swap内存,但是,为一个变量分配所有内存需要大量的后续内存,可能无法使用。尝试使用链表,其中每个元素仅分配了1 MB,您可以总计获得更大的内存。

3-正如您和Sharth所指出的那样,除非您使用内存,否则linux不会分配它。

2020-06-03