c++中的map的使用

carloswxg 2008-06-30 03:59:21

typedef int doc;
typedef string word;
typedef map<word,int> word_int;
typedef map<word,label_df_array> index_backward;
typedef map<doc,word_int> doc_word;
typedef doc_word* index_forward;
用如上的数据结构存放文档的正排和倒排索引结构
在20M的语料上运行系统直接崩溃
原因是占用内存太大
请教高手map对内存的占用具体是怎么分配的?
...全文
246 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
carloswxg 2008-07-02
  • 打赏
  • 举报
回复
一般的程序为堆和栈预留多少空间?
Erorr 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 carloswxg 的回复:]
你这么放的话,map的key和value的值都是放在程序的堆栈上的,但是一般的程序的堆栈的大小也就是10m左右,当然要崩掉。
这个何解?
动态申请的内存才放在堆栈中的吧?
[/Quote]
动态申请的在“堆”(heap)上
局部变量在“堆栈”(stack)上
用new产生的空间就在堆上
20M内存不算大
并发增删是指有没有多线程操作map
carloswxg 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 taodm 的回复:]
基本上,你有并发(增删)、使用了失效的iterator、修改了key这几种行为中的一种或数种。
和内存基本没有关系。
当然,label_df_array自己的内存失效问题要另外考虑。
[/Quote]
并发(增删)是什么意思?
我数据还没完全插入呢 系统就崩溃了
就是统计文档中的词频,文档频率 这些
carloswxg 2008-07-01
  • 打赏
  • 举报
回复
你这么放的话,map的key和value的值都是放在程序的堆栈上的,但是一般的程序的堆栈的大小也就是10m左右,当然要崩掉。
这个何解?
动态申请的内存才放在堆栈中的吧?
hai040 2008-07-01
  • 打赏
  • 举报
回复
map占用的内存不会大
lz可以不停的insert看看要多少次才会崩溃
simo110 2008-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyu637 的回复:]
你这么放的话,map的key和value的值都是放在程序的堆栈上的,但是一般的程序的堆栈的大小也就是10m左右,当然要崩掉。

把map的value的值全部该成指针,

比如
map <word, label_df_array*> index_backward;
[/Quote]
simo110 2008-07-01
  • 打赏
  • 举报
回复
map是二叉排序树实现的内存占用也不是很厉害啊
taodm 2008-07-01
  • 打赏
  • 举报
回复
基本上,你有并发(增删)、使用了失效的iterator、修改了key这几种行为中的一种或数种。
和内存基本没有关系。
当然,label_df_array自己的内存失效问题要另外考虑。
carloswxg 2008-07-01
  • 打赏
  • 举报
回复
请高手详解一下map
map是不是占用内存很厉害
尤其是嵌套map而且记录比较多的时候
jieao111 2008-06-30
  • 打赏
  • 举报
回复
map会再以2倍原空间重新申请新的内存空间

从哪听说的?
carloswxg 2008-06-30
  • 打赏
  • 举报
回复
typedef int* label_df_array;
typedef int doc;
typedef string word;
typedef map<word,int> word_int;
typedef map<word,label_df_array> index_backward;
typedef map<doc,word_int> doc_word;
typedef doc_word* index_forward;

label_df_array是一个指针类型。
系统在20m的语料上运行,内存占用达200多m的时候崩溃掉
map是不是本来占用空间就很大的,因为红黑树有很多指针?
在初始分配的内存不足时,map会再以2倍原空间重新申请新的内存空间,这样业浪费了很多空间?导致系统占用内存很大?
wuyu637 2008-06-30
  • 打赏
  • 举报
回复
你这么放的话,map的key和value的值都是放在程序的堆栈上的,但是一般的程序的堆栈的大小也就是10m左右,当然要崩掉。

把map的value的值全部该成指针,

比如
map<word, label_df_array*> index_backward;

64,654

社区成员

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

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