【问题标题】:How can I store 1 000 000 000 items in an array?如何在数组中存储 1 000 000 000 个项目?
【发布时间】:2019-02-28 22:46:26
【问题描述】:

我正在做老师要求的练习。这项工作需要评估大量值(准确地说是 1 000 000 000),当我尝试在 PosFez 数组中添加值时,程序会出错。

我想我必须使用malloc,但我前段时间学过这些东西,但我不记得该怎么做。我也认为尝试直接评估值会起作用,但我认为我也需要保存数据的唯一方法

#include <stdio.h>

int n,m,q;

int main(){
    scanf("%d %d",&n,&m);

    int PosFez[m];

    for(int i = 0; i < m; i++){
        scanf("%d",&PosFez[i]);
    }

    int Postos[n];
    for(int i = 0; i < n; i++){ 
        Postos[i] = 0;
    }


    scanf("%d",&q);

    int p[q];

    for(int i = 0; i<q;i++){
        scanf("%d",&p[i]);
    }

    for(int i = 0; i < m; i++){
        for(int j = 0; j < PosFez[i]; j++){
            Postos[j]++;
        }
    }   


    for(int i=0; i<q;i++){  
        printf("%d\n",Postos[PosFez[i]-1]);
    }
}

【问题讨论】:

  • 这很可能会破坏堆栈:使用malloc 分配它。有些编译器甚至不会这样做:我的 MSVC 只为整个程序提供了大约 2Gb 的内存。
  • 我真的不记得该怎么做。如果你能帮助我
  • int PosFez[m]; 行更改为int *PosFez = malloc(m * sizeof(int));,并且在完成数组后不要忘记执行free(PosFez);。就此而言,如果您希望 nq 也很大,请对 Postosp 执行相同操作。
  • @MikeHolt 谢谢,我需要整个程序的数据,所以我应该在结束前做free(PosFez); 对吗?
  • @GuilhermeSilva 如果您在没有明确释放内存的情况下退出程序,它将与它使用的其余内存一起被释放

标签: c arrays int


【解决方案1】:

这项工作需要评估大量的值(准确地说是 1 000 000 000),当我尝试在 PosFez 数组中添加值时程序出错

 int PosFez[m];

堆栈中不能有一个 1000 000 000 int 的数组,堆栈大小是有限的(通常为几兆字节,参见 Linux /Unix 下的 ulimit),分配头部中的数组使用例如 malloc

如果你不确定是否需要这么大的数组,你可以分配更少,并且每次都需要使用 realloc 来增加它的大小

【讨论】:

    【解决方案2】:

    首先让我们快速计算一下: 假设一个 int 在您的机器上占用 4 字节(32 位),您将需要大约 3.7GB 的 RAM 来存储数据。因此,如果您只有 4GB 的内存,您可能会用完,因为操作系统和其他程序已经占据了其中的很大一部分。

    其次,正如其他用户所提到的,这个数据量将不适合堆栈。例如,您必须使用 malloc 分配内存。 This site 应该可以帮助您学习。

    如果你真的有那么多值,我猜数据是在某种文件中提供给你的。无需将所有内容加载到内存中,只需解析文件并逐步评估它。 否则,您总是可以将数据写入文件,然后从那里开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 2021-04-15
      相关资源
      最近更新 更多