我的程序是“杀”

gsa*_*ras 5 c++ linux debian kernel kill

可能是由内核的建议在此问题。我想知道为什么我被杀,就像发生暗杀一样。:)

此外,我能做些什么使我的程序正常执行吗?


编年史

我的程序正常执行。但是,我们遇到了一个很大的数据集,即1.000.000 x 960浮点数,我家里的笔记本电脑无法拿走它(给出了std::bad_alloc())。

现在,我在实验室中,台式机配备9.8 GiB,处理器3.00GHz×4,其内存是家用笔记本电脑的两倍多。

在家里,数据集无法加载到std::vector存储数据的。在这里,在实验室中,这已经完成,程序继续构建数据结构。

那是我最后一次听到的消息:

Start building...
Killed
Run Code Online (Sandbox Code Playgroud)

实验室中的桌面在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 +++
Run Code Online (Sandbox Code Playgroud)

所以这告诉我们,我的记忆了,我

Hen*_*rik 5

在 C++ 中,浮点数是单个(32 位)浮点数: http://en.wikipedia.org/wiki/Single- precision_floating-point_format

这意味着您正在分配(无开销)3 840 000 000 字节的数据。

或大约 3,57627869 GB..

让我们安全地假设向量的标头与数据相比什么都不是,并继续使用这个数字。

这是要建立的大量数据,Linux 可能会认为这只是内存泄漏,并通过终止应用程序来保护自己:

https://unix.stackexchange.com/questions/136291/will-linux-start-killing-my-processes-without-asking-me-if-memory-gets-short

我不认为这是一个过度使用的问题,因为您实际上在单个应用程序中使用了近一半的内存。

但也许..考虑这只是为了好玩..您正在构建32位应用程序吗?如果程序是 32 位版本,您将接近 2^32 (4Gb) 的内存空间。

因此,如果您分配了另一个大向量... bum bum bum