周二的时候接到一个新的任务,统计分块大小对系统的读写影响。
具体的描述一下:(注:由于oceanbase已开源,不涉及泄密问题)在我们的系统中,每天要做一次增量合并的操作,比如说整体数据为1到1000,增量数据为1到100,我们按大小把整体数据分为10块。那么第一块数据的范围为1-100,第二块为101-200,以此类推。我们系统的读写是按块来的,也就是说,一次要把所有的一整块(100个数据)都读到内存中,这样的话,当增量数据为1-100时,全部请求都落在了1号块上,那么合并中涉及到的块数量为1;如果增量数据稍微分散一下,变成随机的100个数,很可能造成这100个数落在了不同的块上,那么一次合并操作涉及到的块的数量就可能为10个。
我们需要做的事情就是如何选择块的大小,使得系统中被修改的块的数量比上总块数量的这个比率尽可能小。
最开始这个事情是一个实习生同学负责的,后来由于各种原因,被交接到我这里。
那天接到任务的时候,觉得这其实是一个数学问题,或者说,一个概率问题。
我们可以将这个问题抽象一下,假设所有的数据全部随机,同时,增量数据也全部随机,在这样的前提下,这个问题可以转化为:
将u个不同的小球放入y个不同的盒子中,在操作完成后,不为空的盒子的数量的期望为多少?
将u个不同的小球放入y个不同的盒子中,一共可能有
![](https://img.haomeiwen.com/i1397675/692a4fe2497c7352.png)
种方式。
那么,将u个不同的小球都放入同一个盒子中时,概率为:
![](https://img.haomeiwen.com/i1397675/80aa6729a6c00f94.png)
![](https://img.haomeiwen.com/i1397675/69a7d83ca394410c.png)
将u个不同的小球放入2个不同的盒子中时,概率为:
![](https://img.haomeiwen.com/i1397675/7dfae954da8d49b0.png)
以此类推,在考虑将u个小球放入n个不同的盒子中时,概率应该为:
![](https://img.haomeiwen.com/i1397675/f436296018d0bf31.png)
合并这些子概率,可以得到最终的结果为:
![](https://img.haomeiwen.com/i1397675/b219f5fb412a97e8.png)
本来以为这样是正确的了,发邮件出去的时候,同事提醒我第二个式子有问题,那个累加是没有必要的,后来仔细思考了一下,发现确实是不对的,推导过程如下:
假设Si为n个球放入i个盒子中,且每一个盒子不空,那么可以得到:
![](https://img.haomeiwen.com/i1397675/ff4fa5b84599004e.png)
如上证明,可以得到正确的期望为:
![](https://img.haomeiwen.com/i1397675/4f772f5b9e5b735a.png)
当使用这个式子进行模拟实验时,发现在一些情况下会出现负值。也就是说,这个式子的结果仍然是错误的,我们又一次得到的是一个看似正确的结论。
今天一个下午都在思考这个问题,终于发现错误的原因。
我们在使用减法处理空盒情况时,其实违反了互斥原理。
考虑3个盒子的情况,假设集合{Ai,第i个盒子为空,i=1,2,3}。
总的方式为
![](https://img.haomeiwen.com/i1397675/fe9069eb10c72d2b.png)
![](https://img.haomeiwen.com/i1397675/d57bf8f5e3049d95.png)
所以可以得到:
![](https://img.haomeiwen.com/i1397675/e6e45335365bb9fe.png)
*(注意:其中的“+”) *
这个值的计算,其实来源一个经典问题:
【定义】n个有区别的球放到m个相同的盒子中,要求无一空盒,其不同的方案数用S(n,m)表示,称为第二类Stirling数。
【定理】S(n,m)=mS(n-1,m)+S(n-1,m-1) (n>1,m>1)
在相同盒子的基础上,我们只要乘以盒子数的全排列,就可以得到不同盒的情况。
所以,我们的结论公式应该为:
![](https://img.haomeiwen.com/i1397675/35a4ed13d7968f0c.png)
其中,
![](https://img.haomeiwen.com/i1397675/593ed0f38c839e44.png)
每一个看似正确的地方都可能蕴含着无数的错误和谬论。
**The simple things are always hard. **
over
原文时间(2013-9-4 )
网友评论