为了解决跨公式分享数据的问题(原帖看这里)尝试使用了非持久化的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内存使用量与全局变量差异巨大,好奇背后的机制是什么?
#1-1:是用策略交易组件吗,没有发现问题,停止运行,内存立即释放的。(如果有具体细节请进一步提高)
#2-1:是保存在内存,不写磁盘
#2-2:全部变量相对局部变量的命名,全局变量在当前公式内部是全局,不跨公式。
Dic是整个软件的所有策略单元公式都可以订阅使用。dic内存占用比变量大。
谢谢老师回复,
#1-1: 是在图表上运行的,刚才又试了以下,公式停止运行后不会马上释放内存,还是要手工移除公式才会立即释放,我是在Windows 10 Pro 22H2上运行的TBQuant 3, 下图是公式刚运行结束后的截图:
我想这个内存是不是经过一段时间还是一定会释放的,对吧?
图表没有停止说法,只能删除公式。如果策略交易有停止功能。
原来如此。那如果在调表上调用stop呢?
图表可见即运行了,没有停止之说,可删除公式、关闭图表等。