Malloc内存问题
首先我注意到当我malloc内存与calloc的内存占用是不同的。 我正在处理几个GB的数据集。 这些数据是随机的。
我期望我可以malloc大量的内存,并读取任何随机数据被转换为浮点数。 但是,在进程查看器中查看内存占用情况时,显然不会声明内存(相比calloc,我在这里看到的是较大的脚印)。 我运行一个循环来将数据写入内存,然后我看到内存占用率攀升。 我是否正确地说,在我初始化它之前,内存没有被实际声明?
最后,当我通过1024 * 1024 * 128字节(1024 MB在进程查看器)我开始获得segfaults。 然而,Calloc似乎初始化了最高达1 GB的全部数量。 为什么在使用malloc的for循环初始化内存时出现segfaults,这个数字为128MB,为什么内存占用空间显示为1024MB?
如果malloc在内存中占用大量内存,然后从中读取数据(因为进程查看器在初始化之前几乎没有显示足迹)?
最后有没有办法让我分配超过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);
1-如果您正在使用32位机器,则不能为其分配超过2GB的变量。
2-如果您正在使用64位计算机,则可以分配的RAM和交换内存总数尽可能多,但是,为一个变量分配全部内存需要很大的内存空间,可能无法使用。 尝试使用链接列表,其中每个元素只有1 MB分配,并且您可以实现总共分配更高的内存。
3-正如你和Sharth所指出的,除非你使用你的内存,否则linux不会分配它。
一些说明:
你的#2因为sizeof(long long int) > 8
或者你的malloc返回NULL而导致segfault失败。 如果您请求1 GB的RAM,这是非常可能的。
关于#2的更多信息。 从你的128 MB评论中,我了解到你可能没有意识到发生了什么。 因为您将数组指针声明为long long int
,每个数组元素的大小为8个字节。 1024/8 == 128,这就是为什么你的循环工作。 无论如何,当我尝试它时,它确实如此。