首先,我注意到当malloc内存与calloc时,内存占用量不同。我正在使用几GB的数据集。这些数据是随机的。
我预计我可以只对大量内存进行malloc并读取其中的任何随机数据。然而,在进程查看器中查看内存占用量时,内存显然没有被声明(与我看到大脚印的calloc相比)。我运行循环将数据写入内存,然后我看到内存占用量上升。 我是否正确地说,在我初始化之前,实际上没有声明内存?
最后,当我通过1024 * 1024 * 128字节(进程查看器中为1024 MB)后,我开始获得段错误。然而,Calloc似乎初始化最大1 GB的全部数量。 为什么在使用大于128MB的malloc在for循环中初始化内存时会出现段错误?为什么内存占用量显示为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);
答案 0 :(得分:7)
一些注意事项:
答案 1 :(得分:3)
1-如果您正在使用32位计算机,则不能为其分配超过2GB的变量。
2-如果您正在使用64位计算机,则可以分配RAM + Swap内存,但是,为一个变量分配所有内容需要一个可能无法使用的大量内存。尝试使用链表,其中每个元素仅分配1 MB,您可以实现更高的内存分配。
3-正如你和Sharth所说,除非你使用你的记忆,否则linux不会分配它。
答案 2 :(得分:1)
您的#2因为sizeof(long long int) > 8
或因为您的malloc返回NULL而导致段错误失败。如果您要求1 GB的RAM,这是非常可能的。
关于#2的更多信息。从你的128 MB评论中我得知你可能没有意识到发生了什么。因为您将数组指针声明为long long int
,所以每个数组元素的大小为8个字节。 1024/8 == 128这就是你的循环工作的原因。无论如何,它在我尝试的时候做到了。
答案 3 :(得分:1)
示例代码中的for
循环实际上触及1GB内存,因为它索引为128 * 1024 * 1024 long long
s,每个long long
为8个字节。