在kdb中获取一个大型tplog文件的子集,而无需在内存中加载完整的tplog文件。

问题描述 投票:0回答:1

我有一个几百GB的tplog文件,其中包括许多表的记录--"交易"、"报价 "等。我想在磁盘上创建由交易表记录组成的tplog文件到一个新的tplog文件(tradeTpLog)。由于我的tplog文件很大,因此不可能一次加载完整的tplog文件,所以我想从内存中的tplog文件中读取一条记录,然后检查该表是否为 "交易",如果是,则将该记录追加到磁盘上的tradeTpLog文件中。

测试TpLog文件的记录。

2#get `:./sym2020.05.13
((`upd;`trade;(20:46:39.781823000 20:46:39.781823000;`GS.N`BA.N;178.5163025 128.0462196;798 627j));(`upd;`quote;(20:46:39.782805000 20:46:39.782805000;`IBM.N`VOD.L;191.0897744 341.2843914;191.1130483 341.3052296;564 807j;886 262j)))

我知道-11! 我们可以提供n个元素,但不确定它在这种情况下如何使用。

不成功的尝试。

{if[`trade~x@1;`:./tradeFile upsert x]}@'25#get `:./sym2020.05.13
kdb
1个回答
3
投票

你不能有选择地从日志中提取记录,但你可以只更新up的定义。如果你想创建一个新的日志文件,你就不能使用 upsert,你需要创建一个新的日志文件。

// Preserve the original upd functionality
upd_old::upd;
// Create a new log file and a handle to use
`:tradeLog set ();
h::hopen `:tradeLog;
// Define a new upd 
upd:{[t;x] if[t=`trade;h enlist (`upd;t;x)]};
// Replay the log file
-11!`:./sym2020.05.13;
// Revert the upd functionality
upd::upd_old

使用-11!会比 get.

如果你愿意,你可以选择重播。n 元素通过 -11!(n;x)

© www.soinside.com 2019 - 2024. All rights reserved.