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)
所以这告诉我们,我的记忆了,我猜。
在 C++ 中,浮点数是单个(32 位)浮点数: http://en.wikipedia.org/wiki/Single- precision_floating-point_format
这意味着您正在分配(无开销)3 840 000 000 字节的数据。
或大约 3,57627869 GB..
让我们安全地假设向量的标头与数据相比什么都不是,并继续使用这个数字。
这是要建立的大量数据,Linux 可能会认为这只是内存泄漏,并通过终止应用程序来保护自己:
我不认为这是一个过度使用的问题,因为您实际上在单个应用程序中使用了近一半的内存。
但也许..考虑这只是为了好玩..您正在构建32位应用程序吗?如果程序是 32 位版本,您将接近 2^32 (4Gb) 的内存空间。
因此,如果您分配了另一个大向量... bum bum bum