日期:2014-05-17  浏览次数:21005 次

多线程数据比对
背景:两个List<int>,假定数据量list1,list2分别为10W,比较两个List[i]中数值不相等的部分,记录下来

原先做法: 

for(int i=0;i<list1.Count();i++)
{
   if(list1[i]==list2[i])
   { 
     //记录i值
   }
}

弊端:
显然,这样进行操作单个循环很没有效率,数据量小的时候小可以凑合,由于数据量日益变大,等待比对结果时间过长显然不合适.

我所想的解决:  开10个线程 ,将list1,list2进行"分页" 10个线程分别对应的是第1,2,....10页,10线程得到比对结果,最后汇总结果。

不知道上面的思路是否合理,另外以上的思路是否可以称为“并发”处理?如何用代码来解决这个问题?谢谢各位,给一个demo就可以了
多线程 数据比对 大数据 分页 Linq

------解决方案--------------------
不合理,可能第二个线程中的数字存在于第一个线程中的数据中,你这样比较就会丢很多符合条件的记录
------解决方案--------------------
我觉得你自己的方法就可以,没啥问题
------解决方案--------------------
引用:
补充假定条件=>
list1 和 List2 都已经是经过排序了的 ,现在所需的是在相应的序号上对两边的List进行比对,所以可以忽略页中的数据重复问题。

可以考虑
------解决方案--------------------

int[] result = Enumerable.Range(0, list1.Count).AsParallel().Where(x => list1[x] != list2[x]).ToArray();

------解决方案--------------------
引用:
Quote: 引用:

线程1=>List1 页1 与List2 页1 进行比对

线程2=>List1 页2 与List2 页2 进行比对
不可以,list1页2的数据可能在list2页1中,这样就丢了

cpu的数量如果少,少于线程数,线程就不能完全达到并行计算


Sorry,假定的条件缺少,影响你了:
补充假定条件=>
list1 和 List2 都已经是经过排序了的 ,现在所需的是在相应的序号上对两边的List进行比对,所以可以忽略页中的数据重复问题。


个人认为此法不妥,假如出现以下状况:
List1: {12,13,14,15,16,17,18,19,...}
List2: {12,13,15,16,17,18,19,20,...}
这样从i=2起两个List中同一位置的数值就不相等了。
------解决方案--------------------
引用:

int[] result = Enumerable.Range(0, list1.Count).AsParallel().Where(x => list1[x] != list2[x]).ToArray();

4.0的并行的确牛逼,学习了