这似乎是一个很普遍的问题,但是我还没有find明确的答案。
我可以访问运行linux的服务器,具有16 GB的RAM和16核(64位)cpu(/ proc / cpuinfo给出了“Intel(R)Xeon(R)cpu E5520 @ 2.27GHz”)。 但是,内核是32位(uname -m给i686)。 当然,我没有root权限,所以我不能改变它。
我正在运行一个我编写的C ++程序,它需要一些内存耗费的计算,所以我需要一大堆 – 但是每当我尝试分配超过2GB的数据时,我都会得到一个badalloc,尽pipeulimit返回“unlimited”。 为了简单起见,我们只是说我的程序是这样的:
#include <iostream> #include <vector> int main() { int i = 0; std::vector<std::vector<int> > vv; for (;;) { ++i; vv.resize(vv.size() + 1); std::vector<int>* v = &(vv.at(vv.size() - 1)); v->resize(1024 * 1024 * 128); std::cout << i * 512 << " MB.n"; } return 0; }
用g ++(无标志)编译后,输出结果是:
Windows汇编堆栈和堆栈?
什么是tomcat内存堆提交?
在linux(或POSIX)函数中类似于win32的mem api
在C#GetWriteWatch()?
给日食更多的堆空间编译项目?
512 MB. 1024 MB. 1536 MB. 2048 MB. terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc Aborted
据我了解,这是一个32位系统的限制,显然是因为一个32位指针可以只持有2 ^ 32个不同的地址(我是对的假设,如果我在同一台服务器上编译相同的程序,但该服务器运行64位内核,比程序可以分配2GB以上?)
这不是一个分配的内存是否连续的问题,如果我在示例程序中切片更薄,出现同样的问题,在我的实际程序中,没有大块内存,只有很多小块。
所以我的问题是:有什么我可以做的? 我不能改变操作系统,但我当然可以修改我的源代码,使用不同的编译器选项等等,但是我需要一次超过2GB的内存,而且没有明显的方法来进一步优化algorithm该程序使用。
如果答案是明确的“否”,那么知道这一点还是很好的。
谢谢,卢卡斯
无法使用-Xmx> 966m运行Java
在gdb中检查C / C ++堆内存统计信息
WinDbg中的“Break指令exception”是什么?
堆pipe理
C中的堆大小限制
如果你一次都需要内存,不用,如果不改用64位的内核,是没有办法做到这一点的(这是的,可以让你在一个进程中分配更多的内存)
也就是说,如果你一次不需要所有的内存,而只需要快速的访问,你总是可以将部分内存存储到另一个进程中。
例如,这可以通过将数据存储在其他进程中来工作,并且在需要时使进程临时将该进程的共享内存映射到其自己的内存空间中。 它仍然会被存储在内存中,但是在切换内存范围时会有一些开销。 如果开销是可以接受的还是取决于你的内存访问模式。
这不是一个非常简单的方法,但是如果不改变内核来给你一个64位的地址空间,这听起来像是在一个绑定。
编辑:你可能能够通过重新配置内核来提高2GB以上的限制,但这只是意味着你将达到硬限制。 另外,这将需要root权限。
答案是明确的“不”。 如果无法更改操作系统,则无法提高限制。 这个限制适用于整个流程,显然没有一个单独的分配可以超过每个流程的限制。
根据用于编译内核的选项,限制可能高于2GB,但肯定会小于4GB。 但我想重新编译内核也算“改变操作系统”。
看到这个讨论
是的,在一个64位的操作系统上,这个限制将会消失。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。