场景: 定时器每 3s 接收到一次数据,拿到股票池( 500 多只)的实时价格。 这时需要吧这些数据进行存储,存储完毕后需要运算,比如获取 x 分钟内的涨速,( x 为变量,有用户设定),选出标的。类似这样需要使用日内 tick 数据进行运算。
目前的方案是使用的 sqlite 进行存储( memory 模式),一天下来大概 200 万条数据。各种指标也转换为一些的 sql 语句。 但由于数据越到后面,插入和查询的时间也明显增长得比较厉害。
请问高手们,有什么好的数据结构或者数据库可以推荐,或者有什么好的架构思路?
交易也是实时进行的。 后期还需要扩展到使用 level 数据,时间间隔会在毫秒的。
暂且还是用 python ,我也知道 c++快,可是实现太难,进度也不允许。
1
israinbow 2022-07-16 05:38:35 +08:00 via Android
关系型数据库把两百万条数据放一个表里是不可取得,至少得按时间段分表。
若愿意用 kv 数据库,就上 HBase ,适合高并发的时序数据类型。 |
2
jones2000 2022-07-16 06:24:35 +08:00
可以用 TiDB 数据库试试
|
3
delectate 2022-07-16 07:34:00 +08:00 4
不要造轮子,建议采用 win 所有股票软件常用的方法解决问题:
不同品种,不同周期,分别放在不同的文件内。这样一来每个文件体积会很小,剩下的就是考验 fs 的极限了。 举个例子,rb2210 。tick 、1 、5 、日这四个数据分别按照月或者更小的颗粒度保存在不同文件夹。 2022-07 |-tick / rb / 2210 / data.bin |-1min / rb / 2210 / data.bin |-5min / rb / 2210 / data.bin |-day / rb / 2210 / data.bin 要单独维护一张表,即该品种的主力合约存在移仓、跨月情况,要去读取哪几个数据库。 非 5f 倍数的周期用 1f 数据(如 3f ); 5f 倍数的周期用 5f 数据(如 5f 、15f 、30f 、1H 、4H );日线或者以上用日线的数据计算(如周、月、季、年),此方式适合股票,期货另说。 |
4
BrettD 2022-07-16 07:50:39 +08:00 via iPhone
Kdb
|
5
tramm 2022-07-16 09:05:40 +08:00
时序数据库?
|
6
yagamil OP @delectate 谢谢老哥详细的回复。 这里只用到当天的历史 tick ,3s 级的,其余的历史数据用不到。 实时查询 使用 io ,比在内存里读取还是慢很多。 之前还用的双向队列存储,长度用户初始化时设定,这样比存 sqlite 要省空间,就查询时比较麻烦。
|
8
yejinmo 2022-07-16 11:42:47 +08:00
TDEngine
国内已经有用这个做交易数据的了 |
9
mxuan 2022-07-16 15:14:13 +08:00
KDB ,压缩比巨高,就是要收费(小数据量个人版免费)。次之就是用 HBASE ,influxdb 也是可以的。
其实感觉你的需求偏向 HTAP 数据库,典型的就是 TiDB 。 |
10
HelloAmadeus 2022-07-17 01:07:18 +08:00
直接存 hdf5 里,每日 tick 量都是固定的,array length 先申请,直接填数据就行,很快的。之前做量化的 tick 就是这样存的。
|
11
yagamil OP @HelloAmadeus 这个似乎不错,准备试试。谢谢老哥
|
12
UN2758 2022-07-18 21:06:17 +08:00
前司是 HDF5 格式存的
|