List<order> list1=new List<order>(); List<order> list2=new List<order>(); 假如他们两数据都是上1000w 如何取差集最佳,用linq提供的方法except() 有点慢
楼上的几位都是在瞎扯蛋,他们都是随口说说,根本不注意实际情况,甚至连试一下都不肯。1000万,而且2个1000万数据。能放到内存里么?我觉得吧,对于初学者,像这种数据处理,问题,如果遇到大的数据。就直接放到数据库里处理,因为数据库已经帮我们把这些问题都实现好了,而且不会出现乱七八糟的内存溢出,和线程错乱的问题。而且这是最容易理解,最简单的,最有效果的做法
可以自己定义一个
IEqualityComparer
试试
可以用多线程!
你的内存真多
扔到数据库对比?
试试HashSet
public List<string> GetIntersection2(List<string> list1, List<string> list2)
{
List<string> list3 = new List<string>();
HashSet<string> hashSet = new HashSet<string>();
foreach (string item in list1)
{
hashSet.Add(item);
}
foreach (string item in list2)
{
if (hashSet.Add(item) == false)
{
list3.Add(item);
}
}
return list3;
}
楼上的办法比较好
取差集,List有现成的方法:
var expectedList = list1.Except(list2);
但是如果真的追求高性能,综合楼上各位的答案,使用HashSet+多线程,省空间+时间。
1000W条记录放到List<X>中不会出问题.
我试过,我的机器8G内存.
呵呵…… 两个List 而且X 你是几个字段?每个字段赋值为多少?把你的代码放上来哈……
1000W条,占用的内存应该是GB级别的吧。我觉得应该放数据库里比较。
@zhoumy: 放DB里也是不错的方法,只是插入的时候费点时间,如果速度有要求,并且服务器内存大,可以考虑一下内存比较的.
@hexllo: 一个操作就导致GB级别的内存被占用,假如list里面一个对象占用50字节,2000W个对象算下来就是10GB?如果我没有算错的话。万一一下子有几个请求都要做这个操作,想想就觉得疯狂。。。
@zhoumy: 你赢了
期待更完美的解决方案