我想在一个数组中存储pow(10,12)整数。我知道整数数组只能存储最多的pow(10,7)整数。所以我现在该怎么办?另外,Can vector可以用于此目的吗?在那种情况下,向量的大小限制是多少? 除了数组和向量之外,如果还有其他方法可以实现这一点。
其他细节:编译器= TDM-GCC 4.9.2 64位版本。
答案 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)。
也许您可以以块的形式访问该数组。然后考虑将块存储在某个数据库上(可能使用PostGreSQL或Sqlite)或者可能是一个大的二进制文件。您需要一个大磁盘空间来满足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解决方案,或数据库表,或者???