【问题标题】:Malloc Failing on 64-Bit Ubuntu boxMalloc 在 64 位 Ubuntu 机器上失败
【发布时间】:2011-06-28 02:15:11
【问题描述】:

我在具有 18 GB RAM 的 64 位 Ubuntu 机器上运行以下代码,如您所见,当我尝试分配 2^31 字节时,我对 Malloc 的调用失败。我不确定为什么会发生这种情况,或者如何解决它(我已经尝试过编译器标志和 calloc())。我想知道是否有人可以向我解释为什么我不能在 64 位机器上分配更多空间以及如何解决这个问题。

#include <stdio.h>
#include <stdlib.h>
//#include "svm_model_matlab.h"
//include "svm.h"
#include <math.h>


struct svm_node
{
        int index;
        double value;
};


//#define Malloc(type,n) (type *)calloc(n,sizeof(type))
#define Malloc(type,n) (type *)malloc((n)*sizeof(type))

int main()
{

        int i;
        for(i =25; i< 35; ++i)
        {
                printf("2^%d %d \n", i,(long int) pow(2,i));
                svm_node* x_space = Malloc(struct svm_node,pow(2,i));
                printf("the address is %x\n", x_space);
                free(x_space);
        }


        return 0;
}

输出:

2^25 33554432
the address is 8513e010
2^26 67108864
the address is 6513e010
2^27 134217728
the address is 2513e010
2^28 268435456
the address is a513e010
2^29 536870912
the address is a513e010
2^30 1073741824
the address is 0
2^31 -2147483648
the address is 0
2^32 0
the address is 0
2^33 0
the address is 0
2^34 0
the address is 0

更新:

我发现了我遇到的问题:我目前在 64 位 Ubuntu linux 发行版上的 EC2 上运行我的代码,而 EC2 上的默认 linux 机器有 0 个交换空间。这导致我的进程在请求比物理 RAM 更多的内存时出现段错误,因为它无法分页。创建交换文件后,我的问题就消失了。

感谢您的帮助

【问题讨论】:

  • printf("%d", sizeof(svm_node)) 并告诉我们结果

标签: linux ubuntu memory-management malloc libsvm


【解决方案1】:

pow() 是计算 2 的幂的一种可怕方法。请改用 1 &lt;&lt; i

然后,选择一个足够大的数据类型来容纳您请求的大小。现在它溢出了int 的大小,因此试图分配负数的字节。由于显而易见的原因,这不起作用。

我怀疑malloc(1ULL &lt;&lt; 31) 会在您的系统上成功运行而不会出现任何问题。

接下来,您分配的远远超过问题提到的 231 个字节,您实际上是在尝试分配 2i * sizeof (svm_node),或大约2i+4i=30 的失败分配大约是 16GB,这很可能超过了您的可用 RAM。

最后,在打印指针时,您将获得 32 位值。请改用printf("%p", x_space);。如果这仍然为您提供 32 位值,请尝试使用 64 位编译器。

【讨论】:

  • 感谢您的帮助。我明天要检查一下,但我确实尝试将 svm_node 中的 int 更改为 long、long long 等,但我仍然会看到溢出。此外,这只是一个简单的程序,用于显示尝试解决 libsvm 中的一个更大问题,其中我的训练集大小非常大,以至于我试图 malloc ~ 2^33.1 字节进行模拟,而 malloc 失败了,我是 seg过错。这是我要解决的实际问题,这个简单示例的目的是尝试以更易于理解的格式重现此问题
  • 我不确定我是否遵循你的逻辑本:你说如下:“接下来,你分配的远远超过你的问题提到的 231 个字节,你实际上是在尝试分配 2i * sizeof (svm_node),或者大约 2i+4。失败的分配,i=30,大约是 16GB,这很可能比你的可用 RAM 还多。 .我不明白你是如何计算的。正如您在上面看到的,sizeof(svm_node) = 16 字节由我计算 2^30 1073741824 * sizeof(svm_node) = 17179869 KBs
  • 我的坏本,2^30 1073741824 * sizeof(svm_node) = 17 GBs
猜你喜欢
  • 1970-01-01
  • 2017-11-11
  • 2013-03-23
  • 2015-10-23
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
相关资源
最近更新 更多