首先,我注意到当我使用malloc内存和calloc时,内存占用量是不同的。我正在使用几个GB的数据集。这些数据是随机的是可以的。
我希望我只需要弹出大量内存,并读取其中的任何随机数据,并将其转换为浮点数。但是,从进程查看器中的内存占用情况来看,内存显然没有被占用(与calloc相比,我在这里看到了大量的脚印)。我运行了一个循环,将数据写入内存中,然后我看到内存足迹在上升。--我说得对吗--在我初始化它之前,内存实际上是不被占用的吗?
最后,在我传递1024*1024*128字节(进程查看器中的1024 MB )之后,我开始获取分段错误。然而,Calloc似乎初始化了高达1GB的全部金额。为什么在使用malloc在这个数字为128 in的for循环中初始化内存时会出现分段错误,以及为什么内存占用显示为1024 in?
如果从内存中删除大量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);发布于 2010-12-08 01:43:37
如果你在32位的机器上工作,你就不能有一个超过2GB的变量分配给它。
2-如果您在64位机器上工作,您可以总共分配与RAM+Swap内存一样多的内存,但是,为一个变量分配所有内存需要一大块可能不可用的后续内存。尝试使用一个链接列表,其中每个元素只有1MB的分配,您可以达到一个更高的内存分配总数。
正如您和Sharth所指出的,除非您使用内存,否则linux不会分配它。
发布于 2010-12-08 00:54:01
一些注意事项:
正如注释中所指出的,Linux在使用内存之前实际上不会分配内存。当您使用calloc而不是malloc时,
发布于 2010-12-08 01:29:18
#2由于sizeof(long long int) > 8或malloc返回NULL而失败。如果您请求1GB的RAM,这是非常可能的。
关于#2的更多信息。从你128 MB的评论中,我知道你可能没有意识到发生了什么。因为您将数组指针声明为long long int,所以每个数组元素的大小为8个字节。1024/8 == 128,这就是为什么您的循环工作。不管怎么说,我试过的时候就做到了。
https://stackoverflow.com/questions/4383059
复制相似问题