我怎么能malloc 8 * 10 ^ 9 int内存?

时间:2014-04-21 12:44:01

标签: c gcc malloc dynamic-arrays

我需要一个8 * 10 ^ 9的int数组.... 我知道程序可以使用malloc(SIZE_MAX)有多少内存,但有没有办法改变它? 我正在使用gcc 4.6(mingw)。 Thx提前。

#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
int m=2000*2000,n=2000;
int ** matrix;

matrix = malloc(m * sizeof(int *));
for (i = 0; i < m; i++)
matrix[i] = malloc(n * sizeof(int));
puts("check point1\n");
for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
        matrix[i][j]=5000;
puts("check point2\n");
int * matrix2;
matrix2 = malloc(m * sizeof(int ));
return 0;
}

4 个答案:

答案 0 :(得分:1)

如果你有足够的可用地址空间(32Bit代码没有机会),你可以分配那么多内存(尽管可能使用交换空间)。
麻烦的是,SIZE_MAXsize_t的最大值,几乎总是足以包含整个地址空间。

如果情况并非如此,有多种方法可以解决这个问题:

  1. 使用malloc():许多malloc() - 实现在分配超过某些特定页数时直接分发页面。
  2. 自己直接进入平台api。 {/ 1}}或类似的东西就是你所需要的。
  3. 如果数据已经是可用形式的文件,请考虑将该文件直接映射到您的地址空间。 (可以是方法2的变体)
    • 如果您不需要更改数据,则只读地图。
    • 如果您不想更改文件但必须修改(部分)数据,则映射写入时写入。
    • 如果要修改原始文件,请映射读写。在测试程序之前,请考虑进行备份。
  4. 如果是这种情况,请创建一个足以容纳所有文件的文件,并将视图映射到您当时实际使用的部分。

答案 1 :(得分:1)

如果你有足够的RAM ,你在64位系统上,你应该能够在一个大块中分配它。如果不满足任何一个条件,那么你就麻烦了。在32位系统上运行如此大的阵列是没有明智的方法,并且尝试操作不适合内存的阵列没有多大意义。如果SIZE_MAX不够大,SIZE_MAX只是症状,而不是原因。

答案 2 :(得分:0)

malloc以上SIZE_MAX不能超过malloc。如果您的系统实际上支持您的流程分配的金额超过该金额,则必须通过多次调用SIZE_MAX来执行此操作,每次调用都要求SIZE_MAX不超过calloc()

当然,您还可以考虑使用具有更大SIZE_MAX的其他编译器。

NB。 C标准不清楚SIZE_MAX是否允许其参数的乘积超过size_t,如果允许,是否应该分配比{{1}}更大的块。由于目前尚不清楚,IMO最好不要尝试这一点。我听说有些C库实现只是使用{{1}}来增加参数。

答案 3 :(得分:0)

问题比这更基本。假设您的计算机有足够的内存来将阵列保存在RAM中(否则您将分页/抖动到磁盘),您需要能够解决它。您需要64位操作系统和环境。试试MinGW-w64

使用64位系统的最大动机是地址空间的增加。是的,在64位系统上,您可以在一条指令中添加两个64位操作数,而不是处理低32位然后高32位。因此,在32位系统上需要两条指令才能添加两个64位操作数......这不是什么大不了的事。但是,拥有超过32位的地址空间,即改变游戏规则,现在您可以解决在32位系统中无法解决的大问题。

您的计算机可能有128 GB的RAM,如果您运行的是32位应用程序,您可以处理的虚拟地址最多为32位,即4GB ...是32GB阵列的八分之一!