创建大型数字数组(10^9 大小)

Creating a large array of numbers (10^9 size)

本文关键字:大小 大型 数字 数组 创建      更新时间:2023-10-16

我想创建一个能够存储 10^9 个数字(long int)的数组。如果我尝试这样做,我的编译器崩溃了。C++允许的最大数组大小是多少。此外,如果我也动态执行此操作,我会遇到同样的问题。我怎样才能完成我想要完成的任务?谢谢,任何帮助将不胜感激。

最大数组大小取决于您存储的数据(以及可用于为它们编制索引的整数)。

因此,在 32 位系统上,如果幸运的话,您最多只能索引 2³² 元素,这略高于 10⁹。在 64 位系统上,您可以索引 2⁶⁴ 元素,略高于 10¹⁹。这实质上是最大数组大小。能够索引并不意味着您实际上也可以从操作系统中获得那么多,因为实际的虚拟地址空间可能要小得多。在 Linux 上,每个进程在 64 位(2/² 字节)上可用的虚拟地址空间约为 64 TB。

但是,如果您实际尝试分配它,则需要那么多字节!因此,如果您尝试分配一个大小可能是 64 位的 long int 数组,则需要 8 GB 的内存。

在 32 位系统上,这是不可能的。在 64 位系统上,您需要有该数量的 ram 和交换空间才能工作。

如果您使用的是 32 位系统或没有足够的内存的 64 位系统,则会出现内存不足错误,这可能是您看到的行为的原因。

如果您还尝试在可执行文件的 .data 部分中静态创建数组,则可执行文件最终可能会有 8 GB 大,您可能会遇到文件系统限制(fat32 有人吗?此外,编译器可能会阻塞数据量(在 32 位上,它可能会崩溃)。

如果要在堆栈上分配(这是一个静态大小的局部变量数组),则在某些操作系统上也会遇到堆栈限制。

一个 10^9 个长长的数组通常会占用至少 4GB 的内存,这在所有 32 位系统中已经令人望而却步。

即使 64 位系统中有这么多内存可用,您肯定不能期望像这样在堆栈上分配 4GB:

void foo() {
    long arr[1000000000]; // stack size is a typically few MBs!
}

我不认为这是您的编译器崩溃,而是您的内存崩溃(内存不足或类似的事情),例如在 Windows 32 位中,您最多可以使用小于 2^32*64 的 2^32 位内存空间,因此您将获得内存异常。您可以通过分页和将较小的部分从文件加载到内存来使用它。

编辑:正如Tobias Langner在评论中提到的,编译器也可能引发此错误,但原始问题来自内存。

我想创建一个数组

你真的需要一个数组吗?换句话说,您是否要求整数位于一个内存块中,或者您只是想按索引访问它们?如果您不关心内存布局,但仍希望快速访问元素,则应使用 std::deque .它不会分配一个内存块,而是将您的数字存储在许多小块中,因此只要您有足够的内存将所有数字存储在一起,您就会没事。