怎么解决1000万条数据(key,value)插入到map容器中作统计时间慢的问题

jieyangchenjian 2013-04-30 08:28:12
...全文
937 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
jieyangchenjian 2013-05-01
  • 打赏
  • 举报
回复
或是有没有其他方法可以作类似的统计,就是映射那种
jieyangchenjian 2013-05-01
  • 打赏
  • 举报
回复
有1000个设备,每个设备有10000个时间点,每个设备的时间间隔都不一样(用随机数生成,保存在set中),同一个设备的时间间隔一样,我想统计有哪些不同的时间点,每个时间点都对应哪些设备和相应该设备在该时间点测试的属性值(用随机数模拟)
qq120848369 2013-05-01
  • 打赏
  • 举报
回复
哈希桶不够 你想想就知道单桶里有多长的拉链了
jieyangchenjian 2013-05-01
  • 打赏
  • 举报
回复
#include<iostream>
#include<unordered_map>
#include<set>
#include<windows.h>
#include<ctime>
using namespace std;

const int MAX=1500;
const int MAXN=5000000;
int main()
{
	cout<<"测试1000个设备,每个设备有10000条数据用map统计每个时间点对应哪些设备及相应的数据…………"<<endl;
	int i;
	set<long long> nset;
	unordered_map<long long,unordered_map<int,float>> nmap;
	set<long long>::const_iterator iter;
	unordered_map<long long,float>::iterator iter1;
	unordered_map<long long,unordered_map<int,float>>::iterator iter2;
	
	//产生1000个时间间隔,保存在set中
	srand(time(NULL));

	while(nset.size()!=1000)
	{
		nset.insert(((rand()*rand())%MAX));
	}
	cout<<"开始生成数据……"<<endl;
	
	DWORD stime = GetTickCount();
	for(i=0,iter=nset.begin();i<1000&&iter!=nset.end();i++,iter++)
	{
		unordered_map<long long,float> map1;
		srand(time(NULL));
		for(int j=0;j<10000;j++)
		{
			map1.insert(pair<long long,float>((*iter)*j,((rand()*rand())%MAXN)));
		}

		for(iter1=map1.begin();iter1!=map1.end();iter1++)
		{
			if((iter2=nmap.find(iter1->first))!=nmap.end())
				iter2->second.insert(pair<int,float>(i+1,iter1->second));
			else
			{
				unordered_map<int,float> map2;
				map2.insert(pair<int,float>(i+1,iter1->second));
				nmap.insert(pair<long long,unordered_map<int,float>>(iter1->first,map2));
			}
		}
	}
	DWORD etime = GetTickCount();
	cout<<"10000000条数据用unordered_map统计共花费"<<etime-stime<<"毫秒"<<endl;

}
大神帮忙看一下……
FancyMouse 2013-05-01
  • 打赏
  • 举报
回复
引用 3 楼 jieyangchenjian 的回复:
[quote=引用 1 楼 FancyMouse 的回复:] 用unordered_map
还是和原来一样很慢,很慢……[/quote] 如果慢到分钟级别的话,上代码。一般都是代码写扯了。 如果只是几秒钟觉得慢的话,那没办法。再要快就没法用STL只能自己根据数据特点来设计专用数据结构了。
jieyangchenjian 2013-05-01
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
用unordered_map
还是和原来一样很慢,很慢……
jieyangchenjian 2013-05-01
  • 打赏
  • 举报
回复
引用 楼主 jieyangchenjian 的回复:
还是和原来一样很慢,很慢……
FancyMouse 2013-05-01
  • 打赏
  • 举报
回复
用unordered_map
cqdjyy01234 2013-05-01
  • 打赏
  • 举报
回复
引用 35 楼 jieyangchenjian 的回复:
[quote=引用 34 楼 cqdjyy01234 的回复:] 呵呵,我觉得还可以优化。不过这个就得你自己弄了!
多线程什么的吗?[/quote] 我指的是预先分配内存方面。当然你说的也对。
jieyangchenjian 2013-05-01
  • 打赏
  • 举报
回复
引用 34 楼 cqdjyy01234 的回复:
呵呵,我觉得还可以优化。不过这个就得你自己弄了!
多线程什么的吗?
cqdjyy01234 2013-05-01
  • 打赏
  • 举报
回复
呵呵,我觉得还可以优化。不过这个就得你自己弄了!
jieyangchenjian 2013-05-01
  • 打赏
  • 举报
回复
引用 32 楼 jieyangchenjian 的回复:
[quote=引用 31 楼 cqdjyy01234 的回复:]

关键是你要用release跑,debug会慢很多很多很多



我用“运行不调试”跑,是release的意思吗?[/quote]

哦哦,我懂了,我一直都是在Debug模式下进行的,即便我按了开始执行不调试……
我换了Release之后,突然快了好多啊……
jieyangchenjian 2013-05-01
  • 打赏
  • 举报
回复
引用 31 楼 cqdjyy01234 的回复:

关键是你要用release跑,debug会慢很多很多很多



我用“运行不调试”跑,是release的意思吗?
cqdjyy01234 2013-05-01
  • 打赏
  • 举报
回复
关键是你要用release跑,debug会慢很多很多很多
cqdjyy01234 2013-05-01
  • 打赏
  • 举报
回复
引用 28 楼 jieyangchenjian 的回复:
[quote=引用 27 楼 cqdjyy01234 的回复:] [quote=引用 25 楼 jieyangchenjian 的回复:] [quote=引用 23 楼 cqdjyy01234 的回复:] [quote=引用 21 楼 jieyangchenjian 的回复:]
讲emplace_back(a,b)换成emplace_back(make_pair(a,b))或者push_back(make_pair(a,b))[/quote] 大哥,你有在你的机子上跑一下需要多久吗?[/quote][/quote] 能给一下你机子的配置吗?我在我自己的机子上跑了半天都没出来时间……你13秒已经算很快了[/quote] Intel(R) Core(TM)2 Quad CPU
jieyangchenjian 2013-05-01
  • 打赏
  • 举报
回复
不知道跑时占用内存多少?有没有超过500M……
jieyangchenjian 2013-05-01
  • 打赏
  • 举报
回复
引用 27 楼 cqdjyy01234 的回复:
[quote=引用 25 楼 jieyangchenjian 的回复:] [quote=引用 23 楼 cqdjyy01234 的回复:] [quote=引用 21 楼 jieyangchenjian 的回复:]
讲emplace_back(a,b)换成emplace_back(make_pair(a,b))或者push_back(make_pair(a,b))[/quote] 大哥,你有在你的机子上跑一下需要多久吗?[/quote][/quote] 能给一下你机子的配置吗?我在我自己的机子上跑了半天都没出来时间……你13秒已经算很快了
cqdjyy01234 2013-05-01
  • 打赏
  • 举报
回复
引用 25 楼 jieyangchenjian 的回复:
[quote=引用 23 楼 cqdjyy01234 的回复:] [quote=引用 21 楼 jieyangchenjian 的回复:]
讲emplace_back(a,b)换成emplace_back(make_pair(a,b))或者push_back(make_pair(a,b))[/quote] 大哥,你有在你的机子上跑一下需要多久吗?[/quote]
FancyMouse 2013-05-01
  • 打赏
  • 举报
回复
引用 21 楼 jieyangchenjian 的回复:
debug测性能没意义。 数据生成代码放在测时外面,测时只测hashtable性能。
jieyangchenjian 2013-05-01
  • 打赏
  • 举报
回复
引用 23 楼 cqdjyy01234 的回复:
[quote=引用 21 楼 jieyangchenjian 的回复:]
讲emplace_back(a,b)换成emplace_back(make_pair(a,b))或者push_back(make_pair(a,b))[/quote] 大哥,你有在你的机子上跑一下需要多久吗?
加载更多回复(16)

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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