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不会分配它。


一些说明:

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

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

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

    链接地址: http://www.djcxy.com/p/86491.html

    上一篇: Malloc Memory Questions

    下一篇: CPython and threading module Lock()