hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 1215|回复: 8

如何申请和使用超过2GB大小的内存?

[复制链接]

484

主题

491

帖子

1493

积分

大司空

Rank: 5Rank: 5

积分
1493
发表于 2023-9-30 22:20:39 | 显示全部楼层 |阅读模式
下面这段代码,申请使用1GB的内存:
  1. #include<cstdio>#include<cstring>const long long n=1<<27;long long a[n],i,s;int main(){        memset(a,-1,sizeof(a));        for(s=i=0;i<n;i++)                s+=a[i];        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];

而“1<<33”超过了int范围,目前被识别成0了,无法正确识别成2的33次方。

我应该做些什么尝试,才能使用long long类型的数值来表示数组大小呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

174

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-30 22:21:05 | 显示全部楼层
申请 这么大的连续的 栈空间 应该是不合适的。
实际应用中,都是 内存的文件映射 的方法。比如Linux下就是mmap, windows下就是CreateFileMapping,MapViewofFile
回复

使用道具 举报

0

主题

183

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-30 22:21:53 | 显示全部楼层
把文件系统当内存用,我已经实现了。

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

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

使用道具 举报

0

主题

212

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-30 22:22:35 | 显示全部楼层
可以换成固态硬盘,raid0 提升速度。
纯粹 内存的话,估计在操作系统层面 做了限制。
回复

使用道具 举报

275

主题

454

帖子

1014

积分

大司空

Rank: 5Rank: 5

积分
1014
发表于 2023-9-30 22:23:21 | 显示全部楼层
将"1<<33",改写成“1ull<<33”,应该可以“正确识别成2的33次方”
回复

使用道具 举报

0

主题

212

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-30 22:23:42 | 显示全部楼层
使用vector之类容器,好像可以突破2GB的限制。

但单个容器好像不可以占用超过4GB的内存,否则直接弹出“应用程序遇到问题需要关闭”的窗口。

像下面这个程序这样,使用a和b两个容器,好像就可以突破4GB的内存限制了:
  1. #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[i]+b[i>>1];        printf("%I64d\n",s);        return 0;}
复制代码
其中,a容器申请和使用了4GB的内存,b容器申请和使用了2GB的内存,

加起来一共6GB,成功突破了4GB的限制,

运行这个程序之后,打开任务管理器,可以看到这个程序占用的内存缓缓增加,

最终的内存使用量,确实是6GB:



而程序输出的所有元素求和的结果,也与预期相符:



#####

如果为b容器申请和使用(2GB+1字节)的内存,则运行出错了:



这也许是vector的缺点,他只能倍增扩容,

申请(2GB+1字节)的内存就相当于申请4GB的内存,把我电脑的内存吃光了。

我可能需要去一台内存更大的电脑上,才能继续测试能否申请和使用(4GB+4GB)的内存。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

0

主题

203

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2023-9-30 22:24:22 | 显示全部楼层
可以试一下malloc函数,应该能够突破2G的限制。
回复

使用道具 举报

8

主题

206

帖子

44

积分

新手上路

Rank: 1

积分
44
发表于 2023-9-30 22:24:59 | 显示全部楼层
你截图里的那个64bit是说编译器的版本是64bit的。
但默认还是编译出来32bit的程序。
你想编译64bit程序得编译选项加一个 -m64
回复

使用道具 举报

0

主题

182

帖子

76

积分

关内侯

Rank: 2

积分
76
发表于 2023-9-30 22:25:16 | 显示全部楼层
通常编译器不会允许太大的静态数组,和32位64位没关系
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-11-25 14:56 , Processed in 0.102283 second(s), 22 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

快速回复 返回顶部 返回列表