C++ 创建巨大的 vector

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

对于我尝试运行的进程,我需要一个 std::vectorstd::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);

哪里arcslong 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/

相关文章:

c++ - 我们可以在不使用构造函数的情况下推回包含 vector 的结构吗?

Android Espresso - java.lang.OutOfMemoryError : GC overhead limit exceeded

c++ - 单个套接字上的混合 I/O 操作

c++ - 选择排序指针问题

c++ - 在opengl中显示图像

c++ - 仅当未声明为指针时才为不完整类型

c++ - 有没有办法 decltype 不可调用函数的结果?

performance - 排序算法的内存速度权衡

.net - VB.NET 内存管理

c++ - 为什么 gcc 使用我的自定义迭代器优化掉这个 C++11 foreach 循环?