对于我尝试运行的进程,我需要一个 std::vector
的 std::tuple<long unsigned int, long unsigned int>
.我现在正在做的测试应该创建一个包含 47,614,527,250(约 470 亿)个元组的 vector ,但实际上在创建时崩溃并出现错误 terminate called after throwing an instance of 'std::bad_alloc'
.我的目标是将此脚本与大约两倍大小的 vector 一起使用。代码是这样的:
arc_vector = std::vector<std::tuple<long unsigned int, long unsigned int>>(arcs);
哪里arcs
是 long unsigned int
与引用值。
我可以增加内存大小吗?在那种情况下我该如何增加内存大小?该脚本在具有大约 200GB 内存的 40 核机器上运行,因此我知道内存本身不是问题。
最佳答案
470 亿个元组乘以 16 个字节,每个元组为 7800 亿字节,大约为 760 GB。您的机器只有不到所需内存的 1/3,因此无论程序崩溃的原因如何,您确实需要另一种方法。
我可以给你的一个建议是使用 1TB 的内存映射文件来存储该数组,如果你真的需要使用 vector 作为接口(interface),你可以为它编写一个使用映射内存的自定义分配器。那应该以准透明的方式解决您缺少主内存的问题。如果您的接口(interface)需要标准 vector 和标准分配器,您最好重新设计它。
要补充的另一点是,检查您为运行该进程的用户设置的 ulimit
值,因为它可能有比 760 GB 更严格的虚拟内存限制。
关于C++ 创建巨大的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51175664/