这段回测代码为啥出现严重的内存泄漏,感觉没问题啊,就剩下最简单的数据接收部分,还是泄漏
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('回测结束')
windows系统运行没问题,应该是windows内存不足时会用硬盘当缓存,所以之前一直没发现,这两天在linux上运行就不行了,4g内存的debian服务器运行一小会就被kill了,日志显示内存溢出了。感觉还是要解决下,虽然在windows上能跑,性能肯定有影响
有其他问题欢迎加入官方群聊611806823一起讨论
我自己第一反应也觉得可能是主力合约变换时旧合约数据接收没取消导致的,但是其实不是,程序一开始运行内存占用就不停攀升,不用等到主力合约变换,也跟踪了ts和kd变量的大小,始终是固定的,感觉有可能还是api内部哪里堆积了数据,这个自己就没法查了
我问了下后台老师,主要原因还是因为订阅的时间长导致数据量多,所以占用内存大
代码中拿到的数据是请求的300根数据,但实际在回测中请求的数据是所有K线的数量并且是存在内存里的,且回测模式中不会清除老数据,所以会出现这个现象
添加了内存监测的代码后,发现运行时内存占用快速增长,想了半天不知道问题出在哪里,这么简单的代码,会不会是tqsdk本身的问题,需要升级吗