背景:两个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

解决方案 »

  1.   

    你可以将一个list分页,然后分多个线程去另一个list比对,当然如果你的cpu不给力的话,多线程只能是浪费时间,只是用户体验上会比死循环好一些
      

  2.   


    CPU硬件上是可以的
    List1 分页1,2,3,4,5List2 分页1,2,3,4,5这样可以不?
    线程1=>List1 页1 与List2 页1 进行比对线程2=>List1 页2 与List2 页2 进行比对
    ......
    线程5=>List1 页5 与List2 页5 进行比对
      

  3.   

    线程1=>List1 页1 与List2 页1 进行比对线程2=>List1 页2 与List2 页2 进行比对
    不可以,list1页2的数据可能在list2页1中,这样就丢了cpu的数量如果少,少于线程数,线程就不能完全达到并行计算
      

  4.   


    看它的原先做法,它这个的需求可以这样比吧,list1页2的数据不可能在list2页1中的,因为比较的是相同位置上的数据
      

  5.   


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

  6.   

    可以考虑Thanks bigbaldy & bdmh 现在想到代码的实现有点问题:这样写?
    Thread tn1 = new Thread(() => 比对方法(list1页1,list2页1));
    Thread tn2 = new Thread(() => 比对方法(list1页2,list2页2));
    ...
    Thread tn10 = new Thread(() => 比对方法(list1页10,list2页10));tn1.start();
    tn2.start();
    ....
    tn10.start();又或者循环处理?
      

  7.   


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

  8.   


    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中同一位置的数值就不相等了。
      

  9.   


    Sorry,假定的条件缺少,影响你了:
    补充假定条件=>
    list1 和 List2 都已经是经过排序了的 ,现在所需的是在相应的序号上对两边的List进行比对,所以可以忽略页中的数据重复问题。刚刚少写了一句:
    假如List1和List2出现以下状况:
    List1: {12,13,14,15,16,17,18,19}
    List2: {12,13,15,16,17,18,19,20}
    这样从i=2起两个List中同一位置的数值就不相等了。两个List中重复项共有7项,虽然15,16,17,18,19在两个List中都出现了,但i[2]至i[7]都是不相等的,程序会不会只把i[0]和i[1]重复项?
      

  10.   


    nice 赞一个,这是一种解决问题的好思路,比这我边抓头发想怎么解决多线程的问题方便的多。
      

  11.   


    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中同一位置的数值就不相等了。考虑很精细呀,不过这里只需要比较同一“位置”的数据是否相同,所以这些精细的考虑过虑了
      

  12.   

    感谢各位提供的解决思路,Plinq确实是一个很好的方向,不用太过于关注线程方面的知识(不过这有利有弊)