有词典< Int64,字节>被大量使用。我的意思是在大数据负载下运行数日的循环。 Int64来自两个Int32。该字节恰好是来自许多非常长列表的这两个Int32之间的距离(计数)。将两个Int32结合到Int64中
我需要在这个循环做的是
- 生成密钥
- 如果键不存在于字典然后插入键和值
- 如果键不存在,新的值(字节)小于现有值,则用新值替换现有值
现在我正在使用直数学生成密钥,我知道有更快的方法,但我无法想象它出。我把换档作为标签,因为我认为这是如何优化它,但我无法弄清楚。
然后,当循环完成时,我需要从Int64中提取两个Int32以将数据插入到数据库中。
感谢
根据注释我用的是数学两个的Int32组合成一个Int64的
Int64 BigInt;
Debug.WriteLine(Int32.MaxValue);
Int32 IntA = 0;
Int32 IntB = 1;
BigInt = ((Int64)IntA * Int32.MaxValue) + IntB;
Debug.WriteLine(BigInt.ToString());
IntA = 1;
IntB = 0;
BigInt = ((Int64)IntA * Int32.MaxValue) + IntB;
Debug.WriteLine(BigInt.ToString());
IntA = 1;
IntB = 1;
BigInt = ((Int64)IntA * Int32.MaxValue) + IntB;
Debug.WriteLine(BigInt.ToString());
而最好的关键可能不是一个Int64。我所拥有的是两个Int32一起构成一个关键。和一个字节的值。我需要快速查找该组合键。字典很快,但它不支持组合键,所以我创建了一个实际上是组合键的单个键。在SQL Int32A中,Int32B构成PK。
我不使用复合键的原因是我想查找字典的速度和我的知识字典不支持复合键。这是生产代码。在SQL表中实际上有第三个键(Int32 sID,Int32 IntA,Int32 IntB)。在这个解析器中,我一次只处理一个sID(并且按照顺序处理sID)。我开始用SQL查询组合键(一次运行数十亿次)。当我将IntA,IntB输出到Dictionary来处理单个sID时,在完成每个sID时加载到SQL,我得到了100:1的性能提升。性能改进的一部分是插入,因为当我从字典中插入时,我可以按PK顺序插入。新的IntA和IntB不会按照解析进行排序,因此直接插入SQL会严重地破坏索引,我需要在运行结束时重建索引。
“直数学”是什么意思?请显示一些代码来说明两个int32和int64之间的关系。 – 2012-04-01 17:43:27
@OliCharlesworth我添加了一个我使用的直数学的简单样本。 – Paparazzi 2012-04-01 17:59:05
'Int32.MaxValue'是2^32-1。你确定这就是你想要的吗? – 2012-04-01 18:00:26