我获得了包含多个重复行的大量数据。 我想使用字典进行重复数据删除,然后将数据插入数据库。
row.key
不能设置为DB主键。所以,我不能使用“DB主键无法复制”。
流程将是百万行。
我有两个计划,您认为哪个更快?
计划A:
try
{
dictionary.add(row);
insert into DB
}
catch
{}
B计划:
if( ! dictionary.containskey(row.key) )
{
dictionary.add(row);
insert into DB
}
那么如果我在这个过程中使用多线程呢?这将是访问同一块的多个线程。这会安全有效吗?
答案 0 :(得分:10)
首先,这里没有键/值关系,所以一组而不是一个映射是合适的。您应该使用HashSet
而不是Dictionary
来跟踪密钥。
接下来,查找基于散列的结构非常快,最重要的是,*不依赖于集合的大小。查找100万个项目HashSet与查找5个项目集一样快。这个常数值几乎肯定比依赖抛出的异常更快。
最后,Add
的{{1}}方法表示是否添加了该项,因此您甚至根本不进行任何其他查找。
除此之外,除了性能不佳之外,使用控制流的异常也是不好的做法。出于代码清晰度的原因,您应该将异常用于真正特殊的情况。
答案 1 :(得分:5)
您可以使用HashSet<T>
。它的Add
方法返回一个bool,表示该项已经在其中。
if(hashSet.Add(row.key))
{
insert into DB
}
答案 2 :(得分:1)
计划B应该更快,因为您实际上不必捕获异常。一般来说,B计划也是更好的风格,因为重复的密钥并不是真正的“例外”,它是预期的。
答案 3 :(得分:1)
第二个更快,但你应该使用HashSet,如下所示:
HashSet<string> hash = new HashSet<string>();
if(!hash.Contains(row.key))
{
hash.Add(row.key);
insert into DB
}