创建大型数字数组(10^9 大小)
Creating a large array of numbers (10^9 size)
我想创建一个能够存储 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
.它不会分配一个内存块,而是将您的数字存储在许多小块中,因此只要您有足够的内存将所有数字存储在一起,您就会没事。
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++字符*缓冲区的大小
- 在C++中手动调整数组大小
- C++中高效的大型稀疏块压缩线性方程
- 用C++20 fmt限制结果的总大小
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- 在UNIX系统中使用DIR查找文件的字节大小
- 使用 RapidXML 解析大型 XML(大小大于 65 KB)文件时出现问题
- 为大型数组提供堆大小的编译器
- 带有大型矢量大小的CUDA内核的点产品返回错误的结果
- 为大型本地数据处理扩展堆栈的大小是个好主意吗
- 创建大型数字数组(10^9 大小)
- C++ 数组大小以及如何管理大型数组
- 适用于大型阵列大小的电源组
- 修改大型动态大小的3D阵列mex/C++
- 查找大型boost::unordered_map的大小
- 解析/跳转具有大小元素的大型二进制文件的最快方法
- 大型应用程序插件中的CEF关闭/调整大小问题
- 创建大小为 int arr[1000000][1000000] 的大型 2D 数组
- 如何在 c++ 中确定大型二进制文件的大小