我需要一个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;
}
答案 0 :(得分:1)
如果你有足够的可用地址空间(32Bit代码没有机会),你可以分配那么多内存(尽管可能使用交换空间)。
麻烦的是,SIZE_MAX
是size_t
的最大值,几乎总是足以包含整个地址空间。
如果情况并非如此,有多种方法可以解决这个问题:
malloc()
:许多malloc()
- 实现在分配超过某些特定页数时直接分发页面。如果是这种情况,请创建一个足以容纳所有文件的文件,并将视图映射到您当时实际使用的部分。
答案 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阵列的八分之一!