C++如何存储和读取大量数据(超过2GB)

gcgamet 2014-11-21 05:23:25
加精
先上一段代码
double Find_Delta(...)
{...}

int main()
{
double * Delta = new double[4e8];
for (int i = 0; i < 4e8; i++)
{
Delta[i] = Find_Delta(...);
}
......
......
......
}

求助:现在的情况是我必须要存储这些Delta数据因为在之后的计算中要多次用到,而且这个Delta计算起来很慢,不可能在每次使用时再重新计算一次。所以我用new建立了一个动态数组想要把这些Delta数据存储在堆内存中。但问题是这个数组太大有2GB多,已经超过了堆内存(大概是2GB)。

请问大家一般会如何处理这种问题呢?是不是必须要把数据存储到硬盘中了?我是新手目前只会用ofstream & ifstream,但I/O速度肯定很慢。各位大侠能否推荐几种快速有效的方法呢?唯一的要求就是在读取数据时能够快速的定位数据。比如说我存储了4亿个数据,现在我要读取第7640848个至第9640848个数据。

万分感谢!
...全文
27481 84 打赏 收藏 转发到动态 举报
写回复
用AI写文章
84 条回复
切换为时间正序
请发表友善的回复…
发表回复
手冢的粉 2015-12-04
  • 打赏
  • 举报
回复
学习类,所有回答翻完,总结出来首先考虑设计、再考虑算法、最后才是具体程序实现的问题
忘世麒麟 2015-05-22
  • 打赏
  • 举报
回复
使用一个数据库如何?
热血打工人 2015-05-18
  • 打赏
  • 举报
回复
写入硬盘文件。1T的硬盘已经给力。
yangyunzhao 2015-05-08
  • 打赏
  • 举报
回复
引用 19 楼 yysbest 的回复:
给楼主几个建议 1. 搞清楚“虚拟内存”和“物理内存”的关系和区别,这一点非常重要,否则你的很多认知都是错的。比如说,即便机器只有512M物理内存,依然可以在进程里申请1G内存~~~你所担心的问题,windows都帮你想好了~~~ 2. 32位进程的地址空间是4G,其中可供用户使用的最少2G,所以理论上来说,你在程序里new char [2G]是没有错的。(虽然不建议这样做)。 3. 64位进程的地址空间是2^64,貌似是128T,也就是你说,你在程序里new char [128G],也是没有问题的。 4. 很多人说,把这些数据放到文件中进行处理,这个建议是没错的,但不够准确。因为,以前在32位系统下,2G是最大限制,只能通过使用“文件IO+缓存”的方式进行处理。但在64位时代,一切都不同了。实际上,现在有很多大型后台服务器系统,都是直接把海量数据一次性读到物理内存里的,为的是效率~~~~ 5. 如有其它问题,咱们再讨论~~~
我8G内存,new 1G就报错。虽然有很多剩余空间,可惜没有连续的1G
mengxingxia 2015-05-08
  • 打赏
  • 举报
回复
用数组存?!你的访问策略是什么(如果随机存取,程序还不卡死),应该根据实际应用来决定如果设计算法。 感觉肯定需要按照应用逻辑把数据分块的…………
paschen 版主 2015-02-12
  • 打赏
  • 举报
回复
首先需要处理这么大数据,电脑配置建议用64位,内存也要大 其次,如果不是特别必要,这么大的数据,不要都存在内存里,可以存到硬盘,相对来说,效率仍然很高 我之前存储过2GB的内容到硬盘大概也就2秒的时间 如果是一个数组,依次写入文件,之后要读第几个,计算一下,把文件指针移到要读取的位置读取就行了
707wk 2015-02-11
  • 打赏
  • 举报
回复
文件分段 每10000个数据存放一个文件,一行一个数据,按顺序排列,要查找时或要改写就只修改数据所在的文件就行了
bear234 2015-02-11
  • 打赏
  • 举报
回复
引用 29 楼 sinservice 的回复:
楼主的问题是个设计问题,跟“堆”“内存管理“都没有关系。 这种设计,属于缺陷设计,应重新设计。
唯一一个正确答案...... 文件映射?按照楼主的说法,那我来个4GB的怎么办?8GB的怎么办? 这是设计问题 什么样的需求,需要一次性把这么多数据放到内存里? 数据总量有多少,和一个程序眼下要处理的数据的多少,这是两个概念~~~~ 全世界有60多亿人口,可我眼下要处理的,可能就你一个......我要处理你不需要把60亿人都放进内存里去......
xianyun920 2015-02-11
  • 打赏
  • 举报
回复
这个讨论的先记下,一时半会还用不到这么大的!
旭辉林荫 2014-12-16
  • 打赏
  • 举报
回复
引用 12 楼 ri_aje 的回复:
换64位系统,增加内存。 把大文件切分成很多小的存在硬盘上,寻找的时候先计算需要的数据在那些小文件里,然后只读取他们即可。 上数据库,你的小想法(包括你能在这里得到的)干不过专业的算法的。
++
yangyunzhao 2014-12-04
  • 打赏
  • 举报
回复
朋友,你应该用一种叫内存数据库的东西。 既然是结构化数据,那么直接用mmap的话,查询效率不见得高。 1、用64位系统 2、加大内存,例如16G,现在内存很便宜啦 3、用内存数据库,我喜欢fastdb 你会发现查询速度相当牛的
爱喝雪花啤酒 2014-12-04
  • 打赏
  • 举报
回复
楼主就是有钱,一百分解答,让我想到了 无人区电影;一百。
赵4老师 2014-12-03
  • 打赏
  • 举报
回复
26楼正解!
Javastaying 2014-12-03
  • 打赏
  • 举报
回复
我觉得相当可以·································
RICHEER COCA 2014-12-03
  • 打赏
  • 举报
回复
学习了
GODKINGJH 2014-12-02
  • 打赏
  • 举报
回复
把数据存入文本文件中,分批加载到内存中,C++文件输入输出流读写。
twtiqfn 2014-12-01
  • 打赏
  • 举报
回复
这可是个很高深的问题啊
qq_24042693 2014-11-30
  • 打赏
  • 举报
回复
堆里要超2G,那就用64位系统吧。
fly4free 2014-11-30
  • 打赏
  • 举报
回复
“分页”存储是必须了(除非内存资源足够),每页多大才能高效,可能需要实际运行才知道,可以设置成能配置
小布 2014-11-29
  • 打赏
  • 举报
回复
引用 58 楼 mujiok2003 的回复:
首先, 2GB对于32位支持虚拟内存的系统来时, 可以吧内核压缩到一个1GB ,用户空间便有3GB可用。 但是你不应该申请2GB的连续空间,这个错误不能犯。 其次, 文件读取,只是不是随机乱读, 顺序读写还是比较快的(别忘了缓存机制) 最后, 别动不动就上内存映射, 上数据库。 先简单实现, 测试后性能不满足再说优化成高级IO。
这个顶下,动不动就上数据库的我都懒得喷。 诸位还真以为数据库在大文件处理上就比有经验的程序员再造的轮子快么? 处理100G的文件试试ok? 如果现有的对象关系型数据库真的那么爽,谷歌为毛还要搞大表,为毛还要搞GFS啊。 手动处理没错的楼主,锻炼大数据处理能力(你这还不算大数据)。 我的建议就是如果实在囿于硬件,那就哈希映射,分批有序搞,那么多STL容器放着不用自己搞数组,这才叫造没必要的轮子。
加载更多回复(64)

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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