STL map 效率问题 map.find() 查找居然花费了40多分钟,望高手指教

bsnail 2006-03-07 07:59:50
map<string,string> mymap;
mymap 有近4000个
mymap["022"]="天津"
mymap["010"]="北京"
……

有285万
021
022
023
……
等待查找的字符串存在txt文件中

map.find() 查找居然花费了40多分钟!!小弟不知道哪出了问题,map的效率不可能这么低吧。希望高手指教指教,谢谢!
(以下是主要程序段)
while(GetPhoneNoFromTXT(fp,buf)) //fp 为存放待查找字符串
{

if(mymap.find(buf)!=mymap.end())
{
_snprintf(fname,sizeof(fname),"%s.txt",mymap[buf].c_str());
if((fpnew=fopen(fname,"at+"))==NULL)
{
cout<<"cannot open "<<fname<<endl;
return false;
}

fwrite(buf,sizeof(buf),1,fpnew);
fprintf(fpnew, "\n");
fclose(fpnew);

}
else
{
if(!fpUnknown)
{
if((fpUnknown=fopen("Unknown.txt","w+"))==NULL)
{
cout<<"cannot open fpUnknown.txt"<<endl;
return false;
}
}
fwrite(buf,sizeof(buf),1,fpUnknown);
fprintf(fpUnknown, "\n");
}

memset(&buf, 0, sizeof(buf));
}

...全文
2731 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
bsnail 2006-03-08
  • 打赏
  • 举报
回复
看来还是文件操作耗时太多!
fastzhao 2006-03-08
  • 打赏
  • 举报
回复
估计是文件操作比较费时,还不如存在数据库中
  • 打赏
  • 举报
回复
hashmap 用这个看看
不是标准库的东西,速度肯定快,就是构建的时候可能花时间
Darkay_Lee 2006-03-08
  • 打赏
  • 举报
回复
建议先用一个性能分析工具分析性能瓶颈在那里然后再解决,而不是一下子就认定某个地方出问题了,
除非你是一个非常有经验程序员,否则你是不知道那里才是瓶颈的:)
bsnail 2006-03-08
  • 打赏
  • 举报
回复
要不大家推进一下解决方案
待参考文件 A.txt(4000行为例) 存放参考资料
天津,1234560
天津,1234561
……
北京,2234562
北京,2234563
北京,2234564
待分析文件B.txt (百万行为例)存发待分析字符
1234560
1234561
1234562
1234563
……
bsnail 2006-03-08
  • 打赏
  • 举报
回复
re:Jinhao(辣子鸡丁·新年新气象)
还有循环里的文件操作太多了,不慢才怪。
===============================
那么怎么减少文件操作
bsnail 2006-03-08
  • 打赏
  • 举报
回复
map内部数据结构是一棵平衡二叉树,查找复杂度是O(logN),效率并不低的。
所以问题应该不在map吧,估计是内存用得太多了
==================================================
在运行时,查看内存用得并不多。
cmoring 2006-03-08
  • 打赏
  • 举报
回复
不是msp的find问题
Jinhao 2006-03-07
  • 打赏
  • 举报
回复
map<size_t,string> mymap; //为什么不用这个呢?如果嫌size_t放不下,用class 来分段保存进多个size_t中.

map_type_iterator end = mymap.end();
map_type_iterator iter;

while(GetPhoneNoFromTXT(fp,buf)) //fp 为存放待查找字符串
{
iter = mymap.find(buf);
if(iter != end )
{
_snprintf(fname,sizeof(fname),"%s.txt",iter->c_str());
if((fpnew=fopen(fname,"at+"))==NULL)
{
cout<<"cannot open "<<fname<<endl;
return false;
}

fwrite(buf,sizeof(buf),1,fpnew);
fprintf(fpnew, "\n");
fclose(fpnew);

}
else
{
if(!fpUnknown)
{
if((fpUnknown=fopen("Unknown.txt","w+"))==NULL)
{
cout<<"cannot open fpUnknown.txt"<<endl;
return false;
}
}
fwrite(buf,sizeof(buf),1,fpUnknown);
fprintf(fpUnknown, "\n");
}

还有循环里的文件操作太多了,不慢才怪。
JohnTitor 2006-03-07
  • 打赏
  • 举报
回复
map内部数据结构是一棵平衡二叉树,查找复杂度是O(logN),效率并不低的。
所以问题应该不在map吧,估计是内存用得太多了
fangrk 2006-03-07
  • 打赏
  • 举报
回复
有285万
021
022
023
……
等待查找的字符串存在txt文件中
--------------------------
你的待查找的字符串都是3个数字吗?那怎么会有285万的?有很多重复的!

你的map如果只是查找,而不需要随机插入,那么改用vector+sort+lower_bound吧!
fangrk 2006-03-07
  • 打赏
  • 举报
回复
if(mymap.find(buf)!=mymap.end())
{
_snprintf(fname,sizeof(fname),"%s.txt",mymap[buf].c_str());

你这里查找就查找了两次,一次是mymap.find(buf),一次是mymap[buf]
冥王之锤 2006-03-07
  • 打赏
  • 举报
回复
首先你要确定,你的数据是不是大到,一次没有办法,全部读到内存.STL对这钟情况是没有优化的.
逸学堂 2006-03-07
  • 打赏
  • 举报
回复
map只是适合一般数据量操作。像楼主285万的数据量。
最好用数据库处理
wshcdr 2006-03-07
  • 打赏
  • 举报
回复
把数据存到数据库里试试

65,210

社区成员

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

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