找回密码
 欢迎注册
查看: 2929|回复: 9

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

[复制链接]
发表于 2023-2-6 08:54:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
下面这段代码,申请使用1GB的内存:
  1. #include<cstdio>
  2. #include<cstring>

  3. const long long n=1<<27;
  4. long long a[n],i,s;

  5. int main()
  6. {
  7.         memset(a,-1,sizeof(a));
  8.         for(s=i=0;i<n;i++)
  9.                 s+=a[i];
  10.         printf("%I64d\n",s);
  11.         return 0;
  12. }
复制代码

编译和运行都是没问题的,但把

const long long n=1<<27;

改成

const long long n=1<<28;

编译就出错了,原因是使用了超过2GB大小的内存。

但我的编译环境是64bit的:

compile.png

理论上应该支持申请和使用2GB以上的内存的。

应该做些什么尝试,才能突破这个2GB的限制呢?

#####

此外,由于大数据计算的需要,我还希望使用long long类型的数值来表示数组大小,例如:

char a[1<<33];

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

我应该做些什么尝试,才能使用long long类型的数值来表示数组大小呢?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-2-6 10:20:49 | 显示全部楼层
申请 这么大的连续的 栈空间 应该是不合适的。
实际应用中,都是 内存的文件映射 的方法。比如Linux下就是mmap, windows下就是CreateFileMapping,MapViewofFile
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-2-6 11:08:57 | 显示全部楼层
把文件系统当内存用,我已经实现了。

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

我预测在内存里读写的速度能比文件读写快10倍,所以才设法申请和使用大块内存的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-2-6 11:13:57 | 显示全部楼层
可以换成固态硬盘,raid0 提升速度。
纯粹 内存的话,估计在操作系统层面 做了限制。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-2-6 11:25:11 | 显示全部楼层
将"1<<33",改写成“1ull<<33”,应该可以“正确识别成2的33次方”
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2023-2-6 12:33:26 | 显示全部楼层
使用vector之类容器,好像可以突破2GB的限制。

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

像下面这个程序这样,使用a和b两个容器,好像就可以突破4GB的内存限制了:
  1. #include<cstdio>
  2. #include<vector>
  3. #include<cstring>
  4. using namespace std;

  5. const long long n=1ull<<32;
  6. vector<char>a,b;
  7. long long i,s;

  8. int main()
  9. {
  10.         for(i=0;i<n;i++)
  11.                 a.push_back(i);
  12.         for(i=0;i<n>>1;i++)
  13.                 b.push_back(i);
  14.         for(s=i=0;i<n;i++)
  15.                 s+=a[i]+b[i>>1];
  16.         printf("%I64d\n",s);
  17.         return 0;
  18. }
复制代码

其中,a容器申请和使用了4GB的内存,b容器申请和使用了2GB的内存,

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

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

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

run.png

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

run.png

#####

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

run.png

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

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

我可能需要去一台内存更大的电脑上,才能继续测试能否申请和使用(4GB+4GB)的内存。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-2-6 20:37:39 | 显示全部楼层
可以试一下malloc函数,应该能够突破2G的限制。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-2-7 05:54:28 | 显示全部楼层
你截图里的那个64bit是说编译器的版本是64bit的。
但默认还是编译出来32bit的程序。
你想编译64bit程序得编译选项加一个 -m64

点评

是说TDM-gcc 64bit的编译器在64bit的机器上 默认编译出来的是32bit吗,这倒是超出我的意料  发表于 2023-2-7 10:45
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2023-2-7 12:30:51 来自手机 | 显示全部楼层
通常编译器不会允许太大的静态数组,和32位64位没关系
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-7-23 07:21 , Processed in 0.073638 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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