C#algorithm(大数据),用于查找Excel中多个列和工作表中的重复行

我正在尝试devise一种algorithm,用于跨多个工作表查找Excel文件中的重复行。

假设如下:

1)文件可能非常大。 考虑一个文件有10个工作表(每个1,048,576行),并说30列的数据

2)重复行可能不在同一个工作表上。 例如Sheet1 / Row20可能是Sheet5 / Row123456的副本

3)为了确定一行是否与另一行重复,可以使用其中一列或多列作为用户指定的条件(并非总是所有的列必须相同,用户可以例如指定重复的时间第2,3和5列是相同的)

4)底层数据的顺序不能改变(不先sorting数据,然后检查相邻行)。

5)algorithm必须具有记忆效率。 将一行中所有列的值存储在字典中将占用太多的内存。 不是所有的数据都可以同时存储在内存中(读入.NET multidim数组),因为它已经存储在Excel中,所以这会使内存使用量增加一倍。

6)algorithm必须使用Excel对象模型最小化IO。 不断从Excel中检索单行数据(或执行其他内置Excel互操作)可能会很慢。

到目前为止,我对algorithm有两个不同的想法:

algorithm1)

a)创build一个字典<int,List <Tuple <int,int>,其中字典键是特定行中列中所需值的哈希值,List <Tuple <int,int>是工作表的列表计算到该散列码的索引/行索引

b)一次从Excel中读取大量的数据(比如说5万行)并填写词典。

c)findList中Count> 1的字典中的所有条目,然后遍历所有行,并通过再次从Excel中读取数据并比较实际值来检查是否有重复

algorithm2)

类似于algorithm1,但是使用两个(或者三个)不同的和独立的散列函数来创build一个Tuple <int,int>或者Tuple <int,int,int>作为Dictionary的键。 如果散列函数是独立的,那么除非行实际上是相等的,否则将有一个接近0%的概率,即在一个特定的键上存在冲突。 步骤1c)因此可以省略。

要得到在algo1中使用的hashkey,我会做这样的事情:

private int GetHashKey(List<object> columns) { int hash = 23; foreach (var o in columns) hash = hash * 31 + o.GetHashCode(); return hash; } 

如果我想要做algorithm2)我需要为对象定义一个扩展方法GetHashCode2()(或者至less是Range.Value2的可能的返回数据types,它们是string,double,bool和int)

任何人都可以想到更好的解决scheme? 人们对Algo1和Algo2有什么想法? 如果人们认为Algo2更好,那么任何想法如何创build一个有效且健壮的GetHashCode2()函数,并产生与GetHashCode()不同的哈希码?