VeighNa量化社区
你的开源社区量化交易平台
Member
avatar
加入于:
帖子: 9
声望: 0

请问参数优化过程占用的内存大小是由电脑核心数决定的吗?

电脑16核心32G内存,开启参数优化后占用的内存很快几分钟内就爆掉。

本来以为是线程太多了,但是后来我把run_ga_optimization函数中的max_workers改成了1,但是内存还是慢慢攀升,直到十几分钟后爆掉。。。

求助

Member
avatar
加入于:
帖子: 716
声望: 62

参数优化的线程数是由电脑核心数决定的。

参数优化是通过多次的回测,然后筛选出回测结果做好的参数。所以,在参数优化中会进行多次回测,每次回测都会创建一个BacktestingEngine实例。理论上在每次回测结束后,这个实例都会被python的垃圾回收机制给回收掉,然后就会把内存空出来。但是这个垃圾回收机制可能会有延迟,然后就会一直占着内存,然后就会爆内存。你可能就是缓存没有被及时清除。

你可以试着手动清空缓存。在vnpy_ctastrategy下的backtesting.py文件的最后有evaluate函数,你可以在这个函数return之前调用BacktestingEngine实例的clear_data方法清空掉BacktestingEngine实例中的缓存数据。clear_data里缺少了对self.history_data的清理,你可以照着其他的写一下。

Member
avatar
加入于:
帖子: 9
声望: 0

郭易燔 wrote:

参数优化的线程数是由电脑核心数决定的。

参数优化是通过多次的回测,然后筛选出回测结果做好的参数。所以,在参数优化中会进行多次回测,每次回测都会创建一个BacktestingEngine实例。理论上在每次回测结束后,这个实例都会被python的垃圾回收机制给回收掉,然后就会把内存空出来。但是这个垃圾回收机制可能会有延迟,然后就会一直占着内存,然后就会爆内存。你可能就是缓存没有被及时清除。

你可以试着手动清空缓存。在vnpy_ctastrategy下的backtesting.py文件的最后有evaluate函数,你可以在这个函数return之前调用BacktestingEngine实例的clear_data方法清空掉BacktestingEngine实例中的缓存数据。clear_data里缺少了对self.history_data的清理,你可以照着其他的写一下。

感谢感谢,厉害了,我马上去试一下。

并且,刚才的爆内存是在Ubuntu上出现的,我采用大约同样的配置和参数在Windows上跑,虽然内存也标红,但是还是能跑下来不会被kill,可能是两个平台下的垃圾回收机制不同吧

Member
avatar
加入于:
帖子: 21
声望: 0

郭易燔 wrote:

参数优化的线程数是由电脑核心数决定的。

参数优化是通过多次的回测,然后筛选出回测结果做好的参数。所以,在参数优化中会进行多次回测,每次回测都会创建一个BacktestingEngine实例。理论上在每次回测结束后,这个实例都会被python的垃圾回收机制给回收掉,然后就会把内存空出来。但是这个垃圾回收机制可能会有延迟,然后就会一直占着内存,然后就会爆内存。你可能就是缓存没有被及时清除。

你可以试着手动清空缓存。在vnpy_ctastrategy下的backtesting.py文件的最后有evaluate函数,你可以在这个函数return之前调用BacktestingEngine实例的clear_data方法清空掉BacktestingEngine实例中的缓存数据。clear_data里缺少了对self.history_data的清理,你可以照着其他的写一下。

这个不能清理self.history_data,每个进程的数据只加载一次,后续历史数据不用加载,提升效率用的,每次优化前把它清空,会导致新的优化开始重新加载数据,而数据加载一般比回测运算时间要长一些,得不偿失的。等新版本用python3.10后就可以采用共享内存方式回测,内存肯定不会爆,但是我实验3.8版本的共享内存,发现单次回测运算的效率降低了,也不知道为什么。

Member
avatar
加入于:
帖子: 716
声望: 62

在优化时每次都会创建一个新的实例,不会重复使用之前实例中的数据的,数据不是在这里做缓存优化的。
速度降低可能是跨进程通讯开销比较大,要是方便的话,可以分享一下,大家帮忙测测看,看看是不是有优化的余地。

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】