如何申请和使用超过2GB大小的内存?
下面这段代码,申请使用1GB的内存:#include<cstdio>
#include<cstring>
const long long n=1<<27;
long long a,i,s;
int main()
{
memset(a,-1,sizeof(a));
for(s=i=0;i<n;i++)
s+=a;
printf("%I64d\n",s);
return 0;
}
编译和运行都是没问题的,但把
const long long n=1<<27;
改成
const long long n=1<<28;
编译就出错了,原因是使用了超过2GB大小的内存。
但我的编译环境是64bit的:
理论上应该支持申请和使用2GB以上的内存的。
应该做些什么尝试,才能突破这个2GB的限制呢?
#####
此外,由于大数据计算的需要,我还希望使用long long类型的数值来表示数组大小,例如:
char a;
而“1<<33”超过了int范围,目前被识别成0了,无法正确识别成2的33次方。
我应该做些什么尝试,才能使用long long类型的数值来表示数组大小呢? 申请 这么大的连续的 栈空间 应该是不合适的。
实际应用中,都是 内存的文件映射 的方法。比如Linux下就是mmap, windows下就是CreateFileMapping,MapViewofFile 把文件系统当内存用,我已经实现了。
但我嫌100MB/s的文件读写速度太慢,我想直接读写几百GB的大块内存。
我预测在内存里读写的速度能比文件读写快10倍,所以才设法申请和使用大块内存的。 可以换成固态硬盘,raid0 提升速度。
纯粹 内存的话,估计在操作系统层面 做了限制。 将"1<<33",改写成“1ull<<33”,应该可以“正确识别成2的33次方” 使用vector之类容器,好像可以突破2GB的限制。
但单个容器好像不可以占用超过4GB的内存,否则直接弹出“应用程序遇到问题需要关闭”的窗口。
像下面这个程序这样,使用a和b两个容器,好像就可以突破4GB的内存限制了:
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
const long long n=1ull<<32;
vector<char>a,b;
long long i,s;
int main()
{
for(i=0;i<n;i++)
a.push_back(i);
for(i=0;i<n>>1;i++)
b.push_back(i);
for(s=i=0;i<n;i++)
s+=a+b;
printf("%I64d\n",s);
return 0;
}
其中,a容器申请和使用了4GB的内存,b容器申请和使用了2GB的内存,
加起来一共6GB,成功突破了4GB的限制,
运行这个程序之后,打开任务管理器,可以看到这个程序占用的内存缓缓增加,
最终的内存使用量,确实是6GB:
而程序输出的所有元素求和的结果,也与预期相符:
#####
如果为b容器申请和使用(2GB+1字节)的内存,则运行出错了:
这也许是vector的缺点,他只能倍增扩容,
申请(2GB+1字节)的内存就相当于申请4GB的内存,把我电脑的内存吃光了。
我可能需要去一台内存更大的电脑上,才能继续测试能否申请和使用(4GB+4GB)的内存。 可以试一下malloc函数,应该能够突破2G的限制。 你截图里的那个64bit是说编译器的版本是64bit的。
但默认还是编译出来32bit的程序。
你想编译64bit程序得编译选项加一个 -m64
通常编译器不会允许太大的静态数组,和32位64位没关系
页:
[1]