求问win端怎么申请超过4G的内存

adam_961121 2016-12-12 03:13:32
我最近需要写一个处理字符串的程序,比如计算下后缀数组什么的。但是字符串很大,接近1G,这样随便建一个辅助数组,程序就会报错。
本辣鸡查了查解决办法,发现有以下几种:
(1)是开发64位程序。可我不是很懂怎么编,好像很容易犯错?而且这样真的可以直接就new超过4G内存吗?
(2)是换linux,有人告诉我说64位linux系统把swap分区设大点,就足以解决问题了,可我不会太用linux,而且觉得linux端debug太麻烦了。
(3)是用文件读写代替内存读写,好像是把中间的计算结果存在文件里而不是在内存里,可我不太明白这怎么实现?
求大神指条明路,实在不行只能一个个试了。
...全文
126 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-12-13
  • 打赏
  • 举报
回复
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
adam_961121 2016-12-12
  • 打赏
  • 举报
回复
感谢楼上诸位,不过我想再问个问题。我用VS2015,将解决方案平台改成了x64.这是不是就调成64位编程模式了?不过我这时在debug模式下,申请int a[500000000]会报错,还是说不是有效的win32位程序,但在release模式下就可以运行,这是为什么呢? 还有数组最大长度是有限制的吗?
paschen 2016-12-12
  • 打赏
  • 举报
回复
1、如果要new大于4G内存,只能用64位,64的指针是64位的,32位最大寻址就4GB,只要你注意你代码的风格,32位与64位程序基本是一样的代码 2、可以考虑将暂时不用的数据存于硬盘,而不是内存,这样可以减小内存的使用,去学习文件读写,或者内存映射文件 3、WINDOWS有一个地址窗口扩展的方法也可以让32位程序使用大于4GB的内存
赵4老师 2016-12-12
  • 打赏
  • 举报
回复
楼上代码中File应改为FILE
赵4老师 2016-12-12
  • 打赏
  • 举报
回复
用文件读写代替内存读写楼主不会? 比如
File *fA;fA=fopen("A","r+b");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000];
int B;
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999];
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B;
fclose(fA);
赵4老师 2016-12-12
  • 打赏
  • 举报
回复
容量大小从小到大:栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB~1TB左右的存储时,最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数,linux参考fseeko64函数。
  • 打赏
  • 举报
回复
对于楼主的问题,写64位程序就可以了,但是物理RAM太少也不行,不过64位系统最老的估计也有2GB RAM,不是什么大问题。
  • 打赏
  • 举报
回复
机械硬盘的指标每道重写数千万次,所以“每次 程序运行要 读写硬盘数数百千次,几天后会很快把硬盘损坏出坏道”是不会的。SSD要看NAND写入总量,一般MLC产品100TB+都坏不了,TLC产品可能写入50~70TB就会出现报废的区块,但是有替换区块,一般也不会出现容量减少的情况(smart数据中能看到坏块数在增加)。
zzchinahebei 2016-12-12
  • 打赏
  • 举报
回复
如果 这个变量存于硬盘, 每次 程序运行要 读写硬盘数数百千次,几天后会很快把硬盘损坏出坏道(噪音变很大)。(大的数据库查询就是这样,巨大的变量进不了内存运行, )
zzchinahebei 2016-12-12
  • 打赏
  • 举报
回复
没试验过, 。如果存硬盘,1 G的内容可能消耗1分钟时间 读或者写。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧