【性能优化】8.6 [多维分析] 内存标签异动

 

【性能优化】8.5 [多维分析] 标签位维度

8.6 内存标签异动

标签数据可能随时间变化,比如可能每个月会对客户重新贴一次标签,而我们还希望能针对过去某个月的标签情况进行查询,就需要保存住每个时间点的标签信息。而多维分析的数据量可能很大,这会占用很多存储空间,在外存还不要紧,希望执行高速的内存查询时就是个问题了,紧张的内存很可能无法放下所有时刻的结果数据。

如果每次标签变化量都很大,这也没什么办法。但常常标签变化量很小,远远小于某个时刻的总数据量。这时候,我们可以保存初始状态和每次的变化量,然后迅速计算出某个时刻的数据。

标签数据只有两种取值,只要保存发生变动的标签名称(无论是从 true 变 false 还是从 false 变 true)就可以正确计算出新的标签值。在使用位维度后,可以计算出发生变动的位,然后和原值简单的异或就可以了。



A

B

1

=file("T_new.ctx").open().import()

2

=file("T_change.btx").import()

3

for join@1m(A1,id;A2,id)

=A3.#2.tags.(~-1).group(~\16)

4


=B3.(~.sum(shift(1,-(~%16))))

5


=B3.pselect@a(~!=0)

6


=B5.(("bits"/~/"=xor(bits"/~","/B4(~)/")")

7


>A3.#1.run(${B6.concat@c()})

原数据表和变化信息都以 id 字段作为主键且有序存储,A3 中使用 join@m 表示使用有序归并的办法做内存关联,把变化信息和原数据对齐后,然后在循环体内完成异或计算。B3:B6 的运算类似上一节,计算出需要变化的标签位维度及其计算式。因为变动非常少,把这些信息转换成位来存储反而可能占空间更大,所以不如直接存储发生变动的标签序号集合。

【性能优化】9.1 [集群] 计算与数据分布

【性能优化】 前言及目录