【问题标题】:Cannot allocate memory when using GMP library使用 GMP 库时无法分配内存
【发布时间】:2013-04-22 06:08:09
【问题描述】:

我需要计算三个二维数组。当我尝试使用 GMP 库初始化数组时。我收到以下错误:

GNU MP: Cannot allocate memory (size=16)
Aborted (core dumped)

我的内存是 8GB。 t_column 大约是 2500。row 是一个变量,可以超过 10^7。 部分代码如下:(最后一个for循环导致错误)

    mpf_t **h;
    mpf_t **t;
    mpf_t **r;
    h = (mpf_t**)malloc(sizeof(mpf_t *)*row);
    t = (mpf_t**)malloc(sizeof(mpf_t *)*row);
    r = (mpf_t**)malloc(sizeof(mpf_t *)*256);
    int i, d, j;

    for(i = 0; i < row; i++) {
        h[i] = (mpf_t *)malloc(sizeof(mpf_t)*256);
    }
    for(i = 0; i < row; i++) {
        t[i] = (mpf_t *)malloc(sizeof(mpf_t)*t_column);
    }
    for(i = 0; i < 256; i++) {
        r[i] = (mpf_t *)malloc(sizeof(mpf_t)*t_column);
    }

    for(i = 0; i < row; i++) {
        for(j = 0; j < 256; j++)  {
            mpf_init2(h[i][j], 8);
            mpf_set_str(h[i][j], "0.0", 0);
        }
    }

我该如何解决这个问题?如果其他库有更好的内存分配能力,我愿意接受。

【问题讨论】:

    标签: c memory gmp


    【解决方案1】:

    对于 t_column=2500 和 row=10^7,您的程序将分配大约 2883 MB 内存。

    问题与您的物理内存大小无关。如果您使用的是 32 位操作系统,则您有 2^32=4GB 内存地址空间。通常内核使用1GB的地址空间,所以在剩下的3GB中找不到连续的空间而malloc()失败也就不足为奇了。

    【讨论】:

    • 2500*10^7 已经是 250 亿。即使矩阵的每个条目一个字节(没有开销)也将是一个数量级太大而无法放入内存中。而且 1 个字节比实际分配的要小几个数量级。
    • @richselian,我该如何解决这个问题?我使用的是 32 位 linux,但使用的是 PAE 内核。所以它可以看到8G内存。
    • 不要存储完整的矩阵。这似乎很明显,因为它大约是内存大小的 1OO 倍。也许你可以使用稀疏表示,或者即时计算。
    • @rex,您可以通过 PAE 将 >4GB 内存与多个进程一起使用,但一个进程仍然限制为 4GB。
    • @rex,唯一的解决方案是切换到 64 位操作系统,否则您必须减少程序中的内存使用量。
    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2017-07-15
    相关资源
    最近更新 更多