对于我要运行的进程,我需要拥有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核计算机上运行,因此我知道内存本身不是问题。
答案 0 :(得分:11)
470亿个元组乘以16个字节,每个元组为7800亿字节,约760 gb。您的计算机只有不到1/3的内存,因此,无论程序崩溃的原因如何,您确实需要另一种方法。
我可以给您的建议是使用1TB的内存映射文件来存储该数组,如果您确实需要使用向量作为接口,则可以为其编写一个使用分配的内存的自定义分配器。那应该以半透明的方式解决您缺乏主内存的问题。如果您的接口需要带有标准分配器的标准向量,则最好对其进行重新设计。
要添加的另一点,请检查运行该进程的用户对ulimit
的值,因为它的虚拟内存限制可能比760 gb更为严格。
答案 1 :(得分:5)
您可能拥有一台具有大量内存的计算机,但是问题是您要求该内存必须是连续的。
即使使用内存虚拟化,也不大可能。
对于那样的数据量,您需要使用其他存储容器。您可以根据可细分数据的矢量链接列表,指向元组细分矢量的指针矢量滚动自己的图书,或者查找已经构建了此类结构的库。