KeyTo9_Fans 发表于 2023-2-6 08:54:06

如何申请和使用超过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类型的数值来表示数组大小呢?

wayne 发表于 2023-2-6 10:20:49

申请 这么大的连续的 栈空间 应该是不合适的。
实际应用中,都是 内存的文件映射 的方法。比如Linux下就是mmap, windows下就是CreateFileMapping,MapViewofFile

KeyTo9_Fans 发表于 2023-2-6 11:08:57

把文件系统当内存用,我已经实现了。

但我嫌100MB/s的文件读写速度太慢,我想直接读写几百GB的大块内存。

我预测在内存里读写的速度能比文件读写快10倍,所以才设法申请和使用大块内存的。

wayne 发表于 2023-2-6 11:13:57

可以换成固态硬盘,raid0 提升速度。
纯粹 内存的话,估计在操作系统层面 做了限制。

gxqcn 发表于 2023-2-6 11:25:11

将"1<<33",改写成“1ull<<33”,应该可以“正确识别成2的33次方”

KeyTo9_Fans 发表于 2023-2-6 12:33:26

使用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)的内存。

mathe 发表于 2023-2-6 20:37:39

可以试一下malloc函数,应该能够突破2G的限制。

Ickiverar 发表于 2023-2-7 05:54:28

你截图里的那个64bit是说编译器的版本是64bit的。
但默认还是编译出来32bit的程序。
你想编译64bit程序得编译选项加一个 -m64

mathe 发表于 2023-2-7 12:30:51

通常编译器不会允许太大的静态数组,和32位64位没关系
页: [1]
查看完整版本: 如何申请和使用超过2GB大小的内存?