C++创建巨大的矢量

gio*_*ino 3 c++ memory memory-management bad-alloc c++11

对于一个过程,我试图运行我需要有一个std::vectorstd::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);
Run Code Online (Sandbox Code Playgroud)

带引用值的arcsa 在哪里long unsigned int.

在这种情况下,我可以增加内存大小吗?这个脚本运行在40核机器上,内存大小为200GB,所以我知道内存本身不是问题.

pqn*_*net 11

470亿元组乘以16字节每个元组是780亿字节,大约是760亿字节.你的机器所需的内存不到1/3,所以你真的需要另一种方法,无论程序崩溃的原因是什么.

我可以给你的建议是使用1TB的内存映射文件来存储该数组,如果你真的需要使用vector作为接口,你可以为它使用映射内存编写一个自定义分配器.这应该以准透明的方式解决你缺乏主存的问题.如果您的接口需要标准向量,使用标准分配器,则最好重新设计它.

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

  • @Sander是否会变慢只取决于算法的作用.请注意,由于您的工作集大于主内存,因此无论如何都需要一些磁盘访问.如果您的算法可以以流方式或其他可预测的内存访问模式执行,那么通过显式实现它可能会获得更好的结果,但在大多数情况下,您最终将实现磁盘数据结构的不良缓存机制,操作系统可能会做得更好:与流io相比,内存映射非常快 (2认同)