c ++

时间:2015-10-08 05:11:48

标签: c++ arrays vector size

我想在一个数组中存储pow(10,12)整数。我知道整数数组只能存储最多的pow(10,7)整数。所以我现在该怎么办?另外,Can vector可以用于此目的吗?在那种情况下,向量的大小限制是多少? 除了数组和向量之外,如果还有其他方法可以实现这一点。

其他细节:编译器= TDM-GCC 4.9.2 64位版本。

3 个答案:

答案 0 :(得分:5)

最明显的限制不是语言,而是计算机

10 12 int - egers需要4 TB的内存。你有权使用昂贵的超级计算机吗?他们通常花费数百万美元或€....

如果你这样做,你可能会使用一些堆分配的std::vector<int>std::array<int,1000*1000*1000*1000>(至少在某些x86-64 Linux超级计算机系统上)。

但你可能不这样做:你的计算机的RAM少于4太字节(4096千兆字节);如果它是一个桌面,它最多可能有几十千兆字节。 TDM-GCC适用于Windows,现在所有超级计算机都运行一些Linux版本。

顺便说一句,虽然堆内存在virtual memory,但实际上如果你在一台只有几千兆字节的计算机上分配(如trashing所示)terab数据,你将试验sehe's answer内存。见mmap(2)&amp; Linux上的madvise(2)

也许您可以以块的形式访问该数组。然后考虑将块存储在某个数据库上(可能使用PostGreSQLSqlite)或者可能是一个大的二进制文件。您需要一个大磁盘空间来满足4Tbyte的要求。

顺便说一下,如果你处理那么多数据,我强烈建议你在你的机器上学习和使用Linux,以及Linux的代码,因为所有超级计算机和云集群都是基于Linux的。您可以在Linux笔记本电脑或台式机上为少量数据(例如8Gbytes)制作软件原型,然后将其移植到某些云或超级计算机(这将花费您大笔费用)。

答案 1 :(得分:3)

我不是说你应该这样做。但是你可以利用系统的VMM(所有操作系统都有它)。

这是一个分配文件的简单示例(3.7TB) - 除非您的文件系统不支持稀疏文件,否则它实际上不会写入块。

然后继续在数组中的随机索引处写入5个随机值。

在大多数系统上,这最终会写出最大值。 5个4k块到磁盘,而文件实际上是3.7TB。操作系统将处理按需交换页面并将更改写回磁盘的信息。

<强> Live On Coliru

DBNull.Value

检查结果#include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <iostream> #include <random> // for random writes only #include <functional> // for random writes only int main() { const size_t N = 1000000000000ull; int fd = open("large.db", O_RDWR|O_CREAT, 0777); if (fd==-1) perror("opening"); if (-1==fallocate64(fd, 0, sizeof(int)*N, 1)) perror("fallocate"); int* data = (int*) mmap64(nullptr, sizeof(int)*N, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (data && data!=MAP_FAILED) { auto randindex = std::bind(std::uniform_int_distribution<size_t>(0, N-1), std::mt19937{ std::random_device{} () }); for(int i=0; i<5; ++i) data[randindex()] = rand(); } else { perror("mmap"); } if (data && munmap(data, sizeof(int)*N)) perror("munmap"); close(fd); } ,例如Linux上的large.db将显示实际持久存储到磁盘的已更改数据。

¹Coliru限制不允许这样(显然)

答案 2 :(得分:0)

"I want to store pow(10,12) integer numbers in an array. I know integer array can only store upto pow(10,7) integers.So what should I do now?"

创建一个包装类,其中包含MAX_LENGTH数组的数组。

当用户想要访问(MAX_LENGTH + 10)位置或(2 * MAX_LENGTH + 11)位置时,您的访问方法只是计算出哪个数组具有正确的值范围,然后进行获取/设置就可以了。

如果不会填充此SuperArray(tm)中的每个元素,那么可能使用稀疏矢量/数组?

警告:你的系统可能没有RAM +交换来支持它,你最终会做一些有趣的异国情调的文件系统文件&lt; ==&gt; RAM解决方案,或数据库表,或者???