c-我如何才能malloc 8*10^9内存



我需要一个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 point1n");
for (i = 0; i < m; i++)
    for (j = 0; j < n; j++)
        matrix[i][j]=5000;
puts("check point2n");
int * matrix2;
matrix2 = malloc(m * sizeof(int ));
return 0;
}

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

如果您有足够的地址块可用(没有机会使用32位代码),您可能能够分配那么多内存(可能会使用交换空间)
问题是,SIZE_MAXsize_t的最大值,它几乎总是足以涵盖整个地址空间。

如果不是这样的话,有多种方法可以实现:

  1. 使用malloc():许多malloc()实现在分配超过特定页数时直接分发页面
  2. 直接转到平台api。mmap()或类似的东西是你需要的
  3. 如果数据已经在可用形式的文件中,请考虑将该文件直接映射到您的地址空间中。(可以是方法2的变体)
    • 如果不需要更改数据,则映射为只读
    • 如果您不想更改文件,但必须修改(部分)数据,请在写入时映射副本
    • 如果要修改原始文件,请进行读写映射。在对程序进行测试之前,请考虑进行备份

如果是这样的话,创建一些足够大的文件来容纳所有文件,并将视图映射到您当时实际使用的零件。

malloc不能多于SIZE_MAX。如果你的系统实际上支持你的进程分配超过这个数量的资源,你必须通过多次调用malloc来完成,每次调用的请求不超过SIZE_MAX

当然,您也可以考虑使用具有更大SIZE_MAX的不同编译器。

注:。C标准不清楚calloc()是否允许其自变量的乘积超过SIZE_MAX,如果允许,是否应该分配比SIZE_MAX更大的块。由于目前还不清楚,海事组织最好不要这样做。我听说一些C库实现只是使用size_t来乘以参数。

问题比这更基本。假设你的机器有足够的内存将阵列保存在RAM中(否则你将分页/颠簸到磁盘),你需要能够对其进行寻址。你需要一个64位的操作系统和环境。试试MinGW-w64。

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

您的机器可能有128 GB的RAM,如果您正在运行32位应用程序,则您可以寻址的虚拟地址最多为32位,即4GB。。。32GB阵列大小的八分之一!

相关内容

  • 没有找到相关文章

最新更新