【发布时间】:2015-06-27 03:36:08
【问题描述】:
可能由内核在此question 中建议。我想看看我为什么被杀,就像暗杀发生的功能一样。 :)
另外,有什么办法可以让我的程序正常执行吗?
编年史
我的程序正常执行。但是,我们遇到了一个大数据集,1.000.000 x 960 浮点数,而我在家里的笔记本电脑无法承受(给了std::bad_alloc())。
现在,我在实验室中,使用 9.8 GiB 的台式机,处理器为 3.00GHz × 4,其内存是家用笔记本电脑的两倍多。
在家中,无法将数据集加载到存储数据的std::vector 中。在这里,在实验室中,这已完成,程序继续构建数据结构。
那是我最后一次听到它:
Start building...
Killed
实验室的桌面在 Debian 8 上运行。我的程序在数据集的子集上按预期运行,特别是 1.00.000 x 960 浮点数。
编辑
strace 输出终于可用了:
...
brk..
brk(0x352435000) = 0x352414000
mmap(NULL, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = 0x7f09c1563000
munmap(0x7f09c1563000, 44683264) = 0
munmap(0x7f09c8000000, 22425600) = 0
mprotect(0x7f09c4000000, 135168, PROT_READ|PROT_WRITE) = 0
...
mprotect(0x7f09c6360000, 8003584, PROT_READ|PROT_WRITE) = 0
+++ killed by SIGKILL +++
所以这告诉我们我的记忆力不足,我猜。
【问题讨论】:
-
可能你分配了太多内存。
-
这是可悲的事实@Skynet。我试图运行这个数据集好几天......
-
看到你的问题我真的忍不住笑了:D
-
用
g++ -Wall -Wextra -g编译你的程序;然后使用调试器gdb& valgrind &strace;但是您的程序有错误。还有linux memory overcommit的STFW@ -
程序被杀死而不是更优雅地失败的原因是overcommit。要在程序中获得干净的内存分配失败,请禁用过度使用(这不会使您的程序工作,只会帮助您了解正在发生的事情)。至于为什么过度使用会阻止有用的诊断,既然您知道“功能”的名称,您应该不会很难找到这些信息。
标签: c++ linux kernel debian kill