使用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内存使用量与全局变量差异巨大,好奇背后的机制是什么?