3G的数据文件全部读到内存中,内存是3G吗?

奇默 2012-11-06 01:27:01
我用vector存储读出来的每一行数据,内存占到了7G,问题出在哪
...全文
307 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
奇默 2012-11-07
  • 打赏
  • 举报
回复
引用 16 楼 swordtan 的回复:
每行数据存储格式是string int1 int2,十个文件,总共大约近一亿数据, 最终得到的数据时根据int1排序,对于string和int1相等的,int2相加 一条记录大约有30个字节 ,文件存储,10个字节, 20个字节的字符串 内存无限: 1.如果int1,重复率较高,如int1的值域[1, 100000],可使用桶排序,在排序每个int1键值内的所有string。这……
谢谢了
swordtan 2012-11-07
  • 打赏
  • 举报
回复
每行数据存储格式是string int1 int2,十个文件,总共大约近一亿数据, 最终得到的数据时根据int1排序,对于string和int1相等的,int2相加 一条记录大约有30个字节 ,文件存储,10个字节, 20个字节的字符串 内存无限: 1.如果int1,重复率较高,如int1的值域[1, 100000],可使用桶排序,在排序每个int1键值内的所有string。这个应该较快。 2.如果int1,重复率低,那就用hash。 内存有限: 可以用归并排序,从文件读入一定数量的记录,进行归并排序,排序完成后写入文件,不断进行此操作。 如何存储数据? 1.string类型的额外一般占用8字节,一个指针,一个size。 2.vector和string差不多。 2.string和vector都是一次分配较多的空间,然后存储数据,直到空间不足,空间再翻倍,如果占用空间可确定,可使用reserve函数来明确分配空间。 数据量本身就有3G,只要每条记录需要的额外空间和记录大小相同,那占用7G,就很正常了
proorck6 2012-11-07
  • 打赏
  • 举报
回复

因为数据在内存中不是一个挨一个存储的,所以3GB的数据到了内存里就不是3GB了。
奇默 2012-11-07
  • 打赏
  • 举报
回复
我看了,内存映射对于超过1G的数据,据说很容易出现内存方面的错误,现在数据大概存储到文件是3G
奇默 2012-11-07
  • 打赏
  • 举报
回复
那该用哪种数据结构存储来达到最终目的?谢谢了先
zicheng_lin 2012-11-07
  • 打赏
  • 举报
回复
如果不是非要一次性读入,可以考虑一下 内存映射文件之类的方案嘛
baichi4141 2012-11-07
  • 打赏
  • 举报
回复
用标准库的时候你要知道,它是自己管理所需内存的,而需要多少内存也是由它自己决定的 例如,如果你要用vector<char>保存3字节的数据,你觉得它会申请多少字节?肯定是大于3字节,因为为了提高效率,它会申请一个略大的空间(例如16字节),这样在你push_back新元素的时候,就不会你每push_back一个元素都要重新申请复制删除一次,提高了运行效率,但降低了内存使用率 如果楼主直接申请一块内存,把数据读入内存内,那么大小就是3G 但如果楼主使用标准库,就要想到它有额外的内存开销,包括记录地址长度的空间开销和为提高程序运行效率而多申请的空间开销 vector和string都是这样,二者一嵌套,那额外开销就更大了 具体能不能到达两倍以上我不敢说,毕竟没有研究过这个,只是理论上,标准库必然有额外开销,如果你的字符串都是只有几个字节的,那么很可能预留内存比有效内存要大得多 顺便,对于可预估甚至预知大小的vector,一个一个push_back是最低效率的使用方式
奇默 2012-11-07
  • 打赏
  • 举报
回复
多路归并排好了序,去重。之前的做法是先hash去重累加,在排序,太浪费内存。就换成先归并排序,再去重,但是内存依旧浪费很严重
奇默 2012-11-07
  • 打赏
  • 举报
回复
好吧,是我太弱了,请大神们赐教,谢谢了先。每行数据存储格式是string int1 int2,十个文件,总共大约近一亿数据, 最终得到的数据时根据int1排序,对于string和int1相等的,int2相加
zhouzhipen 2012-11-07
  • 打赏
  • 举报
回复
3G数据一次载入内存?这么大的数据一般都是分块处理。
ryfdizuo 2012-11-06
  • 打赏
  • 举报
回复
pc还是服务器开发?要一次性读入。
辰岡墨竹 2012-11-06
  • 打赏
  • 举报
回复
因为Vector用的是双向链表,指针需要占用空间。
大熊猫侯佩 2012-11-06
  • 打赏
  • 举报
回复
楼主这样写程序的手法,I服了YOU
aperson111 2012-11-06
  • 打赏
  • 举报
回复
如果你不用vector,动态分配内存空间,看看还会不会这样?
奇默 2012-11-06
  • 打赏
  • 举报
回复
不会啊,文件读完就关闭,vector写之前进行了清空 就是正常的读一条数据 push_back一次
aperson111 2012-11-06
  • 打赏
  • 举报
回复
vector有额外开销? 或者你从文件读取结束后,没有关闭,所以造成了内存泄露,变成了2*3G
奇默 2012-11-06
  • 打赏
  • 举报
回复
谢谢,我想知道为什么会这么占内存
healer_kx 2012-11-06
  • 打赏
  • 举报
回复
差不多,应该是7G。

65,210

社区成员

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

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