申请大内存,程序直接被系统干掉,求指教

2023-09-19 22:15:23 +08:00
 LuckyPocketWatch
std::vector<Dev> allDevs;
for(std::size_t i = 0 ; i < DEVLENGHT ; ++i)
    allDevs.push_back(Dev());

其中 class Dev 包含数据为 6 个 int 和若干成员函数,系统为 64 位的 linux ,int 的长度设为 4 字节,机器的物理内存位 256G ,使用 g++8.3 编译以上代码,然后运行,当 DEVLENGHT 设为 10 亿的时候,系统就会直接干掉程序

2189 次点击
所在节点    Linux
12 条回复
huahsiung
2023-09-19 22:30:33 +08:00
我是写 C 的,偶然也写 C++,不知道 gcc 有些时候为什么 malloc()后不用的内存会被优化掉。建议是可以分片,不超过 unsigned int 的最大值( 2^32=4G )。这样在服务器上连续运行了 4 个月,没问题。就是编写的时候管理麻烦。

python 倒没有这个问题。深度学习申请 128G 都不会 kill 。

话说我是直接用 unsigned int 当指针用的。要用的时候,用(char *)或者(void *)强行转换一下。
lsry
2023-09-19 22:39:54 +08:00
首先你的十亿数据,经计算大概要 223G 内存,但是你没有预先分配内存,而是让 vector 自增长,在最后一次分配时就需要 223 * 1.5 = 335G ,这就超过了你的内存限制。
lcdtyph
2023-09-19 22:41:49 +08:00
lz 可能要去搜索 oom killer
LGA1150
2023-09-19 22:42:37 +08:00
看内核日志,有没有触发 oom reaper
geelaw
2023-09-19 22:43:05 +08:00
怎么确定是系统结束了进程,还是进程结束了自己?你试过 try catch 了吗? allDevs.max_size() 是多少?
kneo
2023-09-19 22:49:10 +08:00
难道你想让系统分配几百个 g 的虚拟内存继续帮你搞吗?
leonshaw
2023-09-19 22:52:14 +08:00
试试先 reserve capacity
cnbatch
2023-09-19 23:54:14 +08:00
@lsry 应该是 22.3G 吧

24 Bytes ×10'0000'0000 = 240'0000'0000 Bytes = 23437500 KiB = 22888.18359375 MiB = 22.35174179077148 GiB
cnbatch
2023-09-20 00:00:44 +08:00
不知道 OP 的系统版本是什么,我用自己的台式机试了下并没有 OOM ,正常运行、正常退出。
我台式机安装的 Linux 系统比较小众,是 OpenMandriva ,版本号 16.0.6-3 ,编译器是 clang 16.0.6

同时我还开着 KDE System Monitor ,观察到测试时最高内存占用会升到 25G 左右

C++代码如下:

#include <iostream>
#include <vector>

constexpr size_t DEVLENGHT = 1000000000ULL;

class Dev
{
int a;
int b;
int c;
int d;
int e;
int f;
public:
Dev() : a(0), b(0), c(0), d(0), e(0), f(0) {}
};

int main()
{
std::vector<Dev> allDevs;
for(std::size_t i = 0 ; i < DEVLENGHT ; ++i)
{
try
{
allDevs.push_back(Dev());
}
catch (std::exception &ex)
{
std::cout << ex.what() << std::endl;
std::cout << i << std::endl;
break;
}
}
}
lsry
2023-09-20 00:19:42 +08:00
@cnbatch 是十亿个,你算成了一亿
cnbatch
2023-09-20 00:25:30 +08:00
@lsry
那我换个写法

千分位分隔:
24 Bytes ×1'000'000'000 = 24'000'000'000 Bytes = 23437500 KiB = 22888.18359375 MiB = 22.35174179077148 GiB

One billion ,即十亿

万分位分隔:
24 Bytes ×10'0000'0000 = 240'0000'0000 Bytes = 23437500 KiB = 22888.18359375 MiB = 22.35174179077148 GiB
xiaofan2
2023-09-20 08:50:43 +08:00
dmesg -T 看看 oom killer 日志,另外 google 下 oom killer 机制

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/975343

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX