通过在kdb中的分区表中追加消息来重播tplog文件
我试图通过追加消息将消息从tp日志直接重放到磁盘上的分区表,因为与tplog大小相比,我没有太多的主内存 TpLog如下所示:通过在kdb中的分区表中追加消息来重播tplog文件,kdb,Kdb,我试图通过追加消息将消息从tp日志直接重放到磁盘上的分区表,因为与tplog大小相比,我没有太多的主内存 TpLog如下所示: q)9 2 sublist get `:/Users/uts/Desktop/repos/ktick/tick/sym2020.05.23 `upd `trade (,0D22:38:00.083960000;,`MSFT.O;,45.15104;,710) `upd `quote (,0D22:38:01.082882000;,`VOD.L
q)9 2 sublist get `:/Users/uts/Desktop/repos/ktick/tick/sym2020.05.23
`upd `trade (,0D22:38:00.083960000;,`MSFT.O;,45.15104;,710)
`upd `quote (,0D22:38:01.082882000;,`VOD.L;,341.2765;,341.3056;,732;,481)
我正在使用下面的“upsert”方法将这些tplog MSG追加到分区表,但由于upsert上的类型错误而失败:
quote:([]time:`timespan$();sym:`symbol$();bid:`float$();ask:`float$();bsize:`int$();asize:`int$());
trade:([]time:`timespan$();sym:`symbol$();price:`float$();size:`int$());
`:/Users/uts/db/2020.05.23/quote/ set .Q.en[`:/Users/uts/db;]quote;
`:/Users/uts/db/2020.05.23/trade/ set .Q.en[`:/Users/uts/db;]trade;
upd:{[t;d]
if[`trade~t;[show raze d;`:/Users/uts/db/2020.05.23/trade/ upsert .Q.en[`:/Users/uts/db;]enlist (cols trade)!raze d]];
};
-11!`:/Users/uts/Desktop/repos/ktick/tick/sym2020.05.23
错误:
'type
[1] upd:{[t;d]
if[`trade~t;[show raze d;`:/Users/utsav/db/2020.05.23/trade/ upsert .Q.en[`:/Users/utsav/db;]enlist (cols trade)!raze d]];
^
}
但是,如果我尝试手动将消息附加到分区表中,它工作正常:
`:/Users/uts/db/2020.05.23/trade/ upsert .Q.en[`:/Users/uts/db;]enlist (cols trade)!raze (enlist 0D22:39:00.083960000;enlist `MSFT.O;enlist 45.15104; enlist 710)
不确定为什么“upsert”不能与-11!一起在upd函数中工作
请分享(详细信息/链接),如果有更好的方法(很可能是必须的),可以在不使用太多主内存的情况下将tplogs直接重放到磁盘上。我不确定这是否能解决您的确切问题,但有几点建议:
登记(cols交易)!raze d
代码不起作用(尽管我怀疑在这种情况下有长度错误)。更通用的替代方法是使用:write:{`:/Users/uts/db/2020.05.23/trade/upsert.Q.en[`:/Users/uts/db;值x];从x中删除};
upd:{[t;d]
if[`trade~t;t插入d];
如果[10000我不确定它是否能解决您的确切问题,但有几点建议:
您的代码假定每个tickerplant日志记录都是针对一行的。情况可能并非如此,因为许多tickerplant日志将在一次更新中记录多行。这意味着您的enlist(cols trade)!raze d
代码将无法工作(尽管我怀疑在这种情况下会出现长度错误)。一个更通用的替代方法是使用:
您不应该尝试从tickerplant日志中写入每个upd记录到磁盘-这只是在如此短的时间内写入了太多磁盘。这是低效的,可能会导致磁盘I/O限制。最好在内存中插入,直到表达到一定大小,然后成批写入并擦除表。我建议这样做:例如:
write:{`:/Users/uts/db/2020.05.23/trade/upsert.Q.en[`:/Users/uts/db;值x];从x中删除};
upd:{[t;d]
if[`trade~t;t插入d];
如果[10000
$[0>type first d;enlist cols[trade]!d;flip cols[trade]!d]
write:{`:/Users/uts/db/2020.05.23/trade/ upsert .Q.en[`:/Users/uts/db;value x];delete from x};
upd:{[t;d]
if[`trade~t;t insert d];
if[10000<count value t;write[t]];
};
-11!`:/Users/uts/Desktop/repos/ktick/tick/sym2020.05.23;
if[0<count trade;write[`trade]]; /need to write the leftovers
`sym`time xasc `:/Users/uts/db/2020.05.23/trade/;
@[`:/Users/uts/db/2020.05.23/trade/;`sym;`p#];