有经常使用的 Dictionary <Int64, byte>。我的意思是在大数据负载中运行数天的循环中。Int64 来自两个 Int32。该字节恰好是许多非常长的列表中这两个 Int32 之间的距离(计数)。
在这个循环中我需要做的是
- 生成密钥
- 如果字典中不存在键,则插入键和值
- 如果键确实存在并且新值(字节)小于现有值,则将现有值替换为新值
现在我正在使用直接数学来生成密钥,我知道有更快的方法,但我无法弄清楚。我把 shift 作为一个标签,因为我认为这是如何优化它,但我无法弄清楚。
然后当循环完成时,我需要从 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。
我不使用复合键的原因是我想要 Dictionary 的查找速度,并且据我所知 Dictionary 不支持复合键。这是生产代码。在 SQL 表中实际上还有第三个键(Int32 sID、Int32 IntA、Int32 IntB)。在这个解析器中,我一次只处理一个 sID(并且 sID 是按顺序处理的)。我从对 SQL 的复合键查找开始(一次运行数十亿次)。当我将 IntA、IntB 拉出到 Dictionary 以处理单个 sID,然后在每个 sID 完成时加载到 SQL,我得到了 100:1 的性能提升。部分性能改进是插入,因为当我从字典中插入时,我可以按 PK 顺序插入。新的 IntA 和 IntB 不是由解析生成的,因此直接插入 SQL 会严重分割索引,我需要在运行结束时重建索引。