我编写了一个可以处理大量数据的程序。我的CPU和操作系统(Ubuntu)都是64位,我有4GB的RAM。使用“top”(%Mem字段),我看到进程的内存消耗上升到大约87%,即3.4+ GB然后就被杀了。
然后,我使用“uname -m”检查进程可以访问多少内存,这是“无限制”。
现在,由于操作系统和CPU都是64位且存在交换分区,因此操作系统应该使用虚拟内存,即[交换空间中的大约3.4GB + yGB]并且仅在需要的过程中使用更多的记忆,应该被杀死。
所以,我有以下问题:
请建议。
答案 0 :(得分:2)
不仅数据大小可能是原因。例如,执行ulimit -a
并检查最大堆栈大小。你有杀人的理由吗?设置'ulimit -c 20000'以获取核心文件,它会显示您使用gdb检查它的原因。
答案 1 :(得分:1)
请与file
和ldd
核实您的可执行文件确实是64位。
还检查资源限制。在流程内部,您可以使用getrlimit系统调用(并在可能的情况下使用setrlimit
进行更改)。从bash
shell中,尝试ulimit -a
。从zsh
shell尝试limit
。
还要检查您的进程确实会占用您认为它消耗的内存。如果它的pid是1234,你可以尝试pmap 1234
。在流程内部,您可以阅读/proc/self/maps
或/proc/1234/maps
(您可以从终端中读取)。您/proc/self/smaps
内还有/proc/1234/smaps
或/proc/self/status
以及/proc/1234/status
或/proc/self/
以及其他文件......
检查free
您是否获得了您认为的内存(和交换空间)。您可以使用swapon /tmp/someswapfile
添加一些临时交换空间(并使用mkswap
对其进行初始化)。
我几个月(几年前)经常能够在一台机器上运行一个7Gb进程(一个巨大的cc1
编译),在Gnu / Linux / Debian / Sid / AMD64下运行使用8Gb RAM。
你可以试试一个很小的测试程序,例如用malloc
分配几个内存块,例如每个32Mb。不要忘记在里面写一些字节(至少每兆字节)。
std::map
或std::vector
消耗的内存比我们通常认为的要多。
如果需要,购买更多内存。这些天很便宜。
答案 2 :(得分:0)
在字面意义上可以解决的问题包括你的图形适配器,操作系统内核,BIOS等,并且SWAP也无法扩展可以解决的数量。
另外值得注意的是,进程本身也需要64位。并且某些操作系统可能会变得不稳定,因此如果您使用过多的RAM,则会终止该过程。