c++如何new 大内存(如32G)?(多线程、并行、omp)

yufeicau 2017-06-13 01:47:29
各位大侠好,我最近做多线程和OMP并行计算,发现new的分配内存的总数超不过5G, 不知道怎么处理?具体如下
NEW可分配的最大值,经过搜索,终于看到一个较准确的结果:
http://bbs.csdn.net/topics/370240502
在xp 下,结果为1906(M)
在win7 64位下,32位编译器:1868(M)
在win7 64位下,64位编译器:5488(M)
我的问题不是要突破以上限制,我想开32个线程,每个线程里分配小于1G内存,
因为我的电脑是win764位32G内存,双CPU20核40线程,按猜测可行,
但实际只能开4-5线程,再多就提示std::alloc异常,
怎么才能实现多个线程充分利用计算机的内存呢?
(我尝试过扩大保留堆大小、使用大地址、multi-thred等配置无果)
...全文
3633 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProComing 2021-03-29
  • 打赏
  • 举报
回复
引用 28 楼 super_admi 的回复:
我觉得,你一次要new一个太大的内存,就存在设计问题了。我琢磨着,new超过1G,应该就考虑更改设计了。要么使用流,要么使用其它什么结构来组织数据(如结构化的字符串)。
科学计算使用大内存很常见的,现在各种机器学习算法,不乏使用大内存的
super_admi 2018-01-12
  • 打赏
  • 举报
回复
我觉得,你一次要new一个太大的内存,就存在设计问题了。我琢磨着,new超过1G,应该就考虑更改设计了。要么使用流,要么使用其它什么结构来组织数据(如结构化的字符串)。
牧童吃五谷 2018-01-09
  • 打赏
  • 举报
回复
其实很简单,你只要编写个10来行程序,每次new 1个G内存,然后连续申请20次就行了,程序肯定通过
牧童吃五谷 2018-01-09
  • 打赏
  • 举报
回复
肯定可以超过5G的,我编写的数据库处理程序已经在一个进程中使用到64G内存了,不过最大的一次内存分配一般不超过1G
danscort2000 2017-10-25
  • 打赏
  • 举报
回复
win7 x64下,64位服务器软件编程超过4G很常见啊,没发现什么问题. 我估计楼主是用了多个类似vector的容器来执行大数据计算吧 然后装入vector的时候直接用了 vector.push_back一次导入所有数据 那么出现5G左右就失败就很好理解了 这种操作直接导致了系统内存碎片化 这是很容易犯的错
clever101 2017-08-23
  • 打赏
  • 举报
回复
楼主,你的问题解决了吗?
an_bachelor 2017-08-23
  • 打赏
  • 举报
回复
https://msdn.microsoft.com/en-us/library/windows/desktop/aa366531(v=vs.85).aspx
smwhotjay 2017-08-22
  • 打赏
  • 举报
回复
专业做法,查资料,你编程的语言,内存,那一块, 大内存我没做过,不好多说, 貌似core编程有内存 创建大的可读写内存。 20楼都说了,证明可以 启动了40多个线程,使用到内存都超过32G了 可以问下他的环境,配置 分析
qq_27644399 2017-08-22
  • 打赏
  • 举报
回复
找全局堆的函数分配。new失败try下再用全局堆的方法。。。但一般new是不会出错的。你的库应该版本过低。或者配置问题
牧童吃五谷 2017-08-20
  • 打赏
  • 举报
回复
生成64位程序,然后分配内存大小的时候才用ULONGLONG。 我程序都是启动了40多个线程,使用到内存都超过32G了
赵4老师 2017-06-14
  • 打赏
  • 举报
回复
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。 试试使用RamDisk 无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
oyljerry 2017-06-14
  • 打赏
  • 举报
回复
引用 16 楼 yufeicau 的回复:
有点晕了,上面的程序结果334796M.=326G, 怎么可以分配这么多,但实际上占用的物理内存没有变化。 难道是vs2017 64位配置的问题。。。
虚拟内存而已,实际物理内存需要你写入数据等,才会占用物理内存,而且还有一个虚拟内存页来维护
真相重于对错 2017-06-14
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。 试试使用RamDisk 无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
纠正一下,按照最新的物理学研究,时间和空间也是有限
赵4老师 2017-06-13
  • 打赏
  • 举报
回复
容量大小从小到大:栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB~1TB左右的存储时,最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数,linux参考fseeko64函数。
FILE *fA;fA=fopen("A","rb+");_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);
真相重于对错 2017-06-13
  • 打赏
  • 举报
回复 1
清楚计算机堆内存如何使用的,你就明白为什么不行了,因为堆一般是链表形式,可能总量大于你的要求比如32G,但是表里的每个节点并不能满足你,也就是所说的内存碎片,所以要开大内存,必须另想办法,具体可以看一下stI的内存池的实现
yufeicau 2017-06-13
  • 打赏
  • 举报
回复
有点晕了,上面的程序结果334796M.=326G, 怎么可以分配这么多,但实际上占用的物理内存没有变化。 难道是vs2017 64位配置的问题。。。
yufeicau 2017-06-13
  • 打赏
  • 举报
回复
horris: 用文件可能也不会太慢,但既然我现在有这么大内存,直接计算不是更快更简洁吗,变量要存入硬盘,计算到哪部分读出算完再存,再读下一块数据,。。。。这怎么不用额外的CPU时间?而且还要修改多年以前编好的代码,这可不是简单的工作!你的其他建议我也考虑。
yufeicau 2017-06-13
  • 打赏
  • 举报
回复
hdt: 刚才提到” 我手头计算机最大内存也就8个g,分配超过3g,虽然不报错,机器就跟死了一样,没法证明64位能不能分配超过4g内存。我感觉你这种情况,提高性能,不能指望多线程64位等等。而是应该用分布式。“
【1】下图程序和电脑配置的亲自实践证明了64位不能分配超过4g:

【2】”分配超过3g,虽然不报错,机器就跟死了一样“,这估计和你硬件有关,看上图我打开多个文件分配了13G,没影响工作。
【3】分布式MPi并行我在试验中,mpich2.14目前windows下没有配置成功。
yufeicau 2017-06-13
  • 打赏
  • 举报
回复
还有我现在用的是64位操作系统,用的是64位编译机。
yufeicau 2017-06-13
  • 打赏
  • 举报
回复
worldy: 我现在就是每个线程小块申请,没有一次分配大内存。只是线程多了以后,申请的内存总和大于4.几G失败。
加载更多回复(9)

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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