使用Global变量和非持久化Dic存储数据时的性能问题 【内存使用很大】

为了解决跨公式分享数据的问题(原帖看这里)尝试使用了非持久化的Dic, 然后就发现TB3性能大幅下降,与社区高手讨论学习后意识到应该是Dic引起的(讨论贴看这里)。考虑到策略实盘会长期运行,随着数据的积累可能还是会有性能隐患,关于数据存储的问题还是要搞搞清楚,避免实盘踩大坑,还请老师们不吝赐教。


#1 对Global变量写入数据的测试

测试代码如下:

Vars
    Global Array<Array<Numeric>> dataArray;

Events
    OnReady()
    {
        Integer i;
        Integer j;
        Array<Numeric> newData;
        
        for i=1 to 5000000
        {
            //生成一条new Data,一个长度为24的一维数组
            for j = 0 to 23
                newData[j] = Rand(100, 10000);
            
            //插入到二维数组
            ArrayPushBack(dataArray,newData);
        
        }
        
        Print("数据长度:" + Text(GetArraySize(dataArray)));
    
    }

测试过程:

- 创建一个Global二维数组,然后插入一个尺寸为24的一维数组

- 分别插入5000, 5w, 50w次

- 5000次,5w次内存消耗都不大

- 50w次内存消耗也在预期之内(1.3G), 但是策略停止运行后内存依然保持在1.3G, 直到将策略从【策略单元】内移除,内存才大幅下降到300M以下

问题:

#1-1: 全局变量使用时如果不手动移除策略内存何时会释放?


#2 对非持久化Dic写入数据的测试

测试代码如下:

Vars
    Global Array<Array<Numeric>> dataArray;
    Dic<Array<Array<Numeric>>> Dic_TestPerfData("Pressure_Test", False, "Data");
    Global Numeric dic_write_time(19250127.110211);   //用于确保每个dic内只有一条记录的系统时间
    
Events
    OnReady()
    {
        Integer i;
        Integer j;
        Array<Numeric> newData;
        
        for i=1 to 5000
        {
            //生成一条new Data,一个长度为24的一维数组
            for j = 0 to 23
                newData[j] = Rand(100, 10000);
            
            //插入到二维数组
            ArrayPushBack(dataArray,newData);
            
            If(i % 200 == 0) {
                ArrayErase(dataArray,0, GetArraySize(dataArray) - 100);
            }
            
            //插入到非持久化的Dic
            SetDicValue("Pressure_Test", "Data", dic_write_time, dataArray, False);
        }
        
        Print("数据长度:" + Text(GetArraySize(Dic_TestPerfData)));
    
    }
    

测试过程:

- 创建一个Global二维数组,然后插入一个尺寸为24的一维数组

- 将一维数组插入5000次,每插入一次就写入到一个非持久化的Dic变量,且确保Dic里只有一条数据(实现方法看这里)

- 5000次后内存消耗达到2.8G

- 策略运行停止后,将策略从【策略单元】内移除,这次与Global变量不同,内存不降反升,达到了4G,过了一段时间后才恢复到300M以下

问题:

#2-1: 非持久化的Dic数据是不是只是保存在内存里,整个过程完全不会写入磁盘?

#2-2:非持久化的Dic内存使用量与全局变量差异巨大,好奇背后的机制是什么?

使用Dic跨公式分享数据时TB3性能大幅下降
使用SetDicValue和GetDicValue时数据异常
不持久化???
不持久化的基础数据能保留多久?
请问Dic类型是不是自带Global全局变量属性?
给变量赋值时,可否使用多图层的bar数据?
基础数据变量Dic能否存储map类型数据?
使用tick数据的问题
在【图表模式】和【策略运行】下可以读取Dic但【策略优化】不行
关于变量内存的主动释放

#1-1:是用策略交易组件吗,没有发现问题,停止运行,内存立即释放的。(如果有具体细节请进一步提高)

#2-1:是保存在内存,不写磁盘

#2-2:全部变量相对局部变量的命名,全局变量在当前公式内部是全局,不跨公式。

Dic是整个软件的所有策略单元公式都可以订阅使用。dic内存占用比变量大。

谢谢老师回复,

#1-1: 是在图表上运行的,刚才又试了以下,公式停止运行后不会马上释放内存,还是要手工移除公式才会立即释放,我是在Windows 10 Pro 22H2上运行的TBQuant 3, 下图是公式刚运行结束后的截图:


我想这个内存是不是经过一段时间还是一定会释放的,对吧?

图表没有停止说法,只能删除公式。如果策略交易有停止功能。

原来如此。那如果在调表上调用stop呢?

图表可见即运行了,没有停止之说,可删除公式、关闭图表等。