225 浏览
0

这段回测代码为啥出现严重的内存泄漏,感觉没问题啊,就剩下最简单的数据接收部分,还是泄漏

from tqsdk import TqApi, TqSim, TqAuth
from tqsdk import TqBacktest, BacktestFinished
from tqsdk.tafunc import time_to_str
import datetime
 start_date=datetime.datetime.strptime('2024-01-01',"%Y-%m-%d").date()
end_date=datetime.datetime.strptime('2025-08-31',"%Y-%m-%d").date()
 acc=TqSim(300000)
api=TqApi(acc, backtest=TqBacktest(start_dt=start_date, end_dt=end_date), auth=TqAuth("", ""))
 product='SHFE.ag'
quote=api.get_quote(f"KQ.m@{product}")
main_contract=quote.underlying_symbol
 ts=api.get_tick_serial(main_contract,data_length=5)
kd=api.get_kline_serial(main_contract, duration_seconds=5*60, data_length=300)
 try:
    while True:
        api.wait_update()
        if api.is_changing(quote, "underlying_symbol"):
            main_contract=quote.underlying_symbol
            ts=api.get_tick_serial(main_contract,data_length=5)
            kd=api.get_kline_serial(main_contract, duration_seconds=5*60, data_length=300)
            print(f"{product},{'沪金'},主力合约变换,数据准备完毕,数据量{len(kd)}")
        if api.is_changing(kd.iloc[-1],'datetime'):
            print(f"{time_to_str(kd.datetime.iloc[-1])} {main_contract} {'沪金'} {kd.close.iloc[-1]}")
 except BacktestFinished:
    print('回测结束')
chaos 已回答的问题 7天 前

添加了内存监测的代码后,发现运行时内存占用快速增长,想了半天不知道问题出在哪里,这么简单的代码,会不会是tqsdk本身的问题,需要升级吗

windows系统运行没问题,应该是windows内存不足时会用硬盘当缓存,所以之前一直没发现,这两天在linux上运行就不行了,4g内存的debian服务器运行一小会就被kill了,日志显示内存溢出了。感觉还是要解决下,虽然在windows上能跑,性能肯定有影响

0

可能是因为天勤目前不能取消订阅合约,导致每次主力合约切换时都会累积内存

目前应该只能分段来回测或者减少数据量来解决

chaos 发表新评论 6天 前

有其他问题欢迎加入官方群聊611806823一起讨论

我自己第一反应也觉得可能是主力合约变换时旧合约数据接收没取消导致的,但是其实不是,程序一开始运行内存占用就不停攀升,不用等到主力合约变换,也跟踪了ts和kd变量的大小,始终是固定的,感觉有可能还是api内部哪里堆积了数据,这个自己就没法查了

我问了下后台老师,主要原因还是因为订阅的时间长导致数据量多,所以占用内存大
代码中拿到的数据是请求的300根数据,但实际在回测中请求的数据是所有K线的数量并且是存在内存里的,且回测模式中不会清除老数据,所以会出现这个现象

您正在查看1个答案中的1个,单击此处查看所有答案。