随想六随笔-廿三

2020-07-19 chapter

2020/7/19

流数据处理库,必须能完成两个功能:1.动态规划,自动管理资源;2.能容纳和处理多种不同的数据类型。目前规划如下:最高级别为Repository,其存储单元名为Pool,池是存储一系列存储单元,并配备相应的长度单元和复用记录本的相关数据。例如,我们可以存储二维网格元胞数据池,也可存储二维网格元胞数据缓存池,也可以存储三维数据池及缓存池,也应该可以支持三角形邻居类等等。这实质上是要求存储单元的多种存储类型的支持,然后根据不同要求重载不同的生成和处理方法。

动态规划就应该放在Repository和Pool的层面来运作,放在前者,就是合理的将缓存或内存数据进行转换,节省内存空间,或者将大型Pool分解开,用多个Pool分别处理大Pool。每个Pool都内置一条线程,用于该Pool和其他Pool的交互及内部操作。

另外有Scheduler总调度器,其负责管理的是任务配置和IO需求,拥有任务队列和IO队列。这里的任务实质上相当于一个信号,发送给指定的Pool,以使Pool完成对应的操作,同时还有IO任务,是一种特殊的任务,要求Pool完成一个IO动作。这里每个Pool线程实质上都是一个正在等待任务的状态,所以决定Pool线程实际行动的就是任务队列了。

动态规划实际上权力巨大,而且任务队列是全局的,对于每一个正在执行的任务或未执行的任务都可以明白其环境上下文,这就提供了可以优化的空间,但是仍有待开发。

另外还有推演数据库,即接收C_Int或Py_Tuple类型数据,处理并返回赋值数据。由于发生模型的多样性,我们也需要一个很大的抽象化来应对不同可能的发生模型,但考虑到各发生模型间实在是可能差异巨大,所以总库:Calculus只对基本的事物做出规定,剩余具体项目另设新库(以具体规则命名)进行处理。总库Calculus应有如下设计:1.多线程处理设计;2.IO缓存池设计;3.面向不同规则的基本抽象计算单元。

抽象单元的设计可以先考虑一个问题:有效性计算。即区域一定是局部的。例如对大型元胞网格,其总会分化为一块一块的区域,对于其他区域,以一种缺省的态度来理解(甚至更进一步,将这些区域记录为未知或待定区域,可以进行供以干涉器入场)这要求我们在存储函数库和处理函数库进行相应处理,可以说,这就是用块(Block)进行计算,代替之前的空间(Space)。

之前提到了分区异步计算,这实质上就是按块计算的衍生品,我们可以对每一个计算任务标记一段应用规则与应用步数,不同区域计算时会不断更新这两个数据(当然,一般来说,应用规则是不变的),步数之前允许不同,会造成分区异步现象,不同的块会进行“预演计算”,意思是计算快的会将传出块的数据记录起来,导入到可能的周围的新块中,若周围的新块也发生了异变,传出了新块到计算更快的新块中,则新块进行重置,重置到之前的相应步数中,若没有,则照常进行。这里要求块有一个很好的划分:真正意义上地存储了“一块图案”。