C ++创建巨大的向量

时间:2018-07-04 14:09:19

标签: c++ c++11 memory memory-management bad-alloc

对于我要运行的进程,我需要拥有std::vector中的std::tuple<long unsigned int, long unsigned int>。我现在正在执行的测试应该创建一个47,614,527,250(约470亿)元组的向量,但实际上在创建时就崩溃了,错误为terminate called after throwing an instance of 'std::bad_alloc'。我的目标是将此脚本与大约两倍大小的向量一起使用。代码是这样的:

arc_vector = std::vector<std::tuple<long unsigned int, long unsigned int>>(arcs);

其中arcs是带有引用值的long unsigned int

我可以(在那种情况下如何)增加内存大小吗?该脚本在具有200GB内存的40核计算机上运行,​​因此我知道内存本身不是问题。

2 个答案:

答案 0 :(得分:11)

470亿个元组乘以16个字节,每个元组为7800亿字节,约760 gb。您的计算机只有不到1/3的内存,因此,无论程序崩溃的原因如何,您确实需要另一种方法。

我可以给您的建议是使用1TB的内存映射文件来存储该数组,如果您确实需要使用向量作为接口,则可以为其编写一个使用分配的内存的自定义分配器。那应该以半透明的方式解决您缺乏主内存的问题。如果您的接口需要带有标准分配器的标准向量,则最好对其进行重新设计。

要添加的另一点,请检查运行该进程的用户对ulimit的值,因为它的虚拟内存限制可能比760 gb更为严格。

答案 1 :(得分:5)

您可能拥有一台具有大量内存的计算机,但是问题是您要求该内存必须是连续的。

即使使用内存虚拟化,也不大可能。

对于那样的数据量,您需要使用其他存储容器。您可以根据可细分数据的矢量链接列表,指向元组细分矢量的指针矢量滚动自己的图书,或者查找已经构建了此类结构的库。